Нам создали установщик продукта с Wix, содержа пакет программы ("V1") и некоторые конфигурационные файлы. Теперь, мы собираемся сделать значительное обновление с новым кодом продукта, где старая версия продукта удаляется, и "V2" установлен. То, что мы хотим, должно сохранить один из конфигурационных файлов от удаления, так как это необходимо для V2, также. К сожалению, мы забыли устанавливать Permanent="yes"
опция, когда мы поставили V1 (читает этот вопрос для получения дополнительной информации).
Здесь прибывает вопрос: существует ли простой способ предотвратить удаление файла во всяком случае? Конечно, мы могли добавить пользовательское действие к сценарию для резервного копирования файла перед удалением и другим пользовательским действием для восстановления его впоследствии, но по моему скромному мнению который, кажется, излишество для этой задачи и мог бы вмешаться в другие части процесса регистрации MSI.
Править: И да, NeverOverwrite="yes"
атрибут уже установлен в V2, и поведение состоит в том, поскольку я описал это.
Я не думаю, что это поможет изменить что-то непосредственно в параметрах компонента V2. Возможно, существует шанс изменить реестр так или иначе в пользовательском действии прежде, чем удалить V1, таким образом, сервис установщика думает, что конфигурационный файл в V1 был установлен с Permanent="yes"
?
Попробуйте использовать атрибут 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>