WiX, как предотвратить удаление файлов, хотя мы забыли установить Permanent = "yes" - PullRequest
8 голосов
/ 11 мая 2010

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

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

РЕДАКТИРОВАТЬ: И да, атрибут NeverOverwrite="yes" уже установлен в V2, и поведение такое, как я его описал.

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

Ответы [ 2 ]

6 голосов
/ 12 мая 2010

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

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

EDIT

Я только что проверил это в тестовой настройке. Сначала это не сработало, потому что я запланировал действие 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>
0 голосов
/ 28 января 2013

Способ, которым я исправляю это очень просто. Я не устанавливаю файлы yourapp.config, а только yourapp.config.new При первом запуске приложения, прежде чем делать что-либо еще, проверьте файл конфигурации. Если их нет, сделайте копию yourapp.config.new для yourapp.config

Это очень просто, он не использует никаких специальных атрибутов. Когда приложение удаляется, файл конфигурации не удаляется. При переустановке приложения файл нарушается. Обратите внимание, что при восстановлении приложения конфигурация также не изменяется.

...