WiX, как препятствовать тому, чтобы файлы удалили, хотя мы забыли устанавливать Постоянный = “да”

Нам создали установщик продукта с Wix, содержа пакет программы ("V1") и некоторые конфигурационные файлы. Теперь, мы собираемся сделать значительное обновление с новым кодом продукта, где старая версия продукта удаляется, и "V2" установлен. То, что мы хотим, должно сохранить один из конфигурационных файлов от удаления, так как это необходимо для V2, также. К сожалению, мы забыли устанавливать Permanent="yes" опция, когда мы поставили V1 (читает этот вопрос для получения дополнительной информации).

Здесь прибывает вопрос: существует ли простой способ предотвратить удаление файла во всяком случае? Конечно, мы могли добавить пользовательское действие к сценарию для резервного копирования файла перед удалением и другим пользовательским действием для восстановления его впоследствии, но по моему скромному мнению который, кажется, излишество для этой задачи и мог бы вмешаться в другие части процесса регистрации MSI.

Править: И да, NeverOverwrite="yes" атрибут уже установлен в V2, и поведение состоит в том, поскольку я описал это.

Я не думаю, что это поможет изменить что-то непосредственно в параметрах компонента V2. Возможно, существует шанс изменить реестр так или иначе в пользовательском действии прежде, чем удалить V1, таким образом, сервис установщика думает, что конфигурационный файл в V1 был установлен с Permanent="yes"?

8
задан Community 23 May 2017 в 12:30
поделиться

1 ответ

Попробуйте использовать атрибут NeverOverwrite для файла конфигурации

Если для этого атрибута установлено значение «да», то {{1} } Программа установки не устанавливает или переустанавливает компонент, если ключевой путь к файлу или запись реестра ключевого пути для компонента уже существует.

РЕДАКТИРОВАТЬ

Я только что проверил это на тестовой установке. Сначала это не сработало, потому что я запланировал действие RemoveExistingProducts до последовательности InstallInitialize . Это удаляет старый продукт до того, как будет установлен новый, поэтому его нельзя будет сравнивать.

Однако, когда я установил его после InstallFinalize , он действительно работал, он оставил файл там, хотя в исходной настройке не было задано NeverOverwrite . вот два моих тестовых примера

версия 1.0.0.0

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Product Id="35d07bf8-a729-402d-83d6-fdc55799a3d5" Language="1033" Manufacturer="..." Name="test1" UpgradeCode="9773a278-068d-4fac-8241-4a5b7e54f15a" Version="1.0.0.0">
        <Package Compressed="no" InstallerVersion="200" />
        <Property Id="ALLUSERS" Value="1" />
        <Upgrade Id="9773a278-068d-4fac-8241-4a5b7e54f15a">
            <UpgradeVersion OnlyDetect="no" Property="REMOVEOLDVERSION" Maximum="1.0.0.0" IncludeMaximum="no" />
            <UpgradeVersion OnlyDetect="yes" Property="NEWERFOUND" Minimum="1.0.0.0" IncludeMinimum="no" />
        </Upgrade>
        <Directory Id="TARGETDIR" Name="SourceDir">
            <Directory Id="ProgramFilesFolder" Name="ProgramFilesFolder">
                <Directory Id="INSTALLDIR" Name="test1">
                    <Component Id="New_Text_Document.txt" Guid="{CCA38D83-A890-4528-B11D-DA2E2DCDED93}" Feature="ProductFeature">
                        <File Id="New_Text_Document.txt" KeyPath="yes" Source="Harvest\ProgramFilesFolder\INSTALLDIR\New Text Document.txt" />
                    </Component>
                </Directory>
            </Directory>
        </Directory>
        <Feature Id="ProductFeature" Level="1" Title="CompletePackage" Description="The complete Product." Display="expand" />
        <CustomAction Id="NewerFound" Error="A later version of [ProductName] is already installed" />
        <InstallExecuteSequence>
            <Custom Action="NewerFound" After="FindRelatedProducts">NEWERFOUND</Custom>
            <RemoveExistingProducts After="InstallFinalize" />
        </InstallExecuteSequence>
        <UIRef Id="WixUI_Minimal" />
        <Media Id="1" />
        <UI />
    </Product>
</Wix>

версия 1.0.1.0

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Product Id="1da36626-d760-4c4c-8a5c-3eb3841dbfd5" Language="1033" Manufacturer="..." Name="test1" UpgradeCode="9773a278-068d-4fac-8241-4a5b7e54f15a" Version="1.0.1.0">
        <Package Compressed="no" InstallerVersion="200" />
        <Property Id="ALLUSERS" Value="1" />
        <Upgrade Id="9773a278-068d-4fac-8241-4a5b7e54f15a">
            <UpgradeVersion OnlyDetect="no" Property="REMOVEOLDVERSION" Maximum="1.0.1.0" IncludeMaximum="no" />
            <UpgradeVersion OnlyDetect="yes" Property="NEWERFOUND" Minimum="1.0.1.0" IncludeMinimum="no" />
        </Upgrade>
        <Directory Id="TARGETDIR" Name="SourceDir">
            <Directory Id="ProgramFilesFolder" Name="ProgramFilesFolder">
                <Directory Id="INSTALLDIR" Name="test1">
                    <Component Id="New_Text_Document.txt" Guid="{CCA38D83-A890-4528-B11D-DA2E2DCDED93}" Feature="ProductFeature" NeverOverwrite="yes">
                        <File Id="New_Text_Document.txt" KeyPath="yes" Source="Harvest\ProgramFilesFolder\INSTALLDIR\New Text Document.txt" />
                    </Component>
                </Directory>
            </Directory>
        </Directory>
        <Feature Id="ProductFeature" Level="1" Title="CompletePackage" Description="The complete Product." Display="expand" />
        <CustomAction Id="NewerFound" Error="A later version of [ProductName] is already installed" />
        <InstallExecuteSequence>
            <Custom Action="NewerFound" After="FindRelatedProducts">
NEWERFOUND</Custom>
            <RemoveExistingProducts After="InstallFinalize" />
        </InstallExecuteSequence>
        <UIRef Id="WixUI_Minimal" />
        <Media Id="1" />
        <UI />
    </Product>
</Wix>
6
ответ дан 5 December 2019 в 22:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: