Wix: состояние на имущество не работает - PullRequest
1 голос
/ 24 ноября 2011

У меня есть элемент util: RemoveFolderEx, который я хочу запускать только при удалении программы.Я помещаю его в его собственный компонент, а затем устанавливаю условие для свойства относительно того, должно ли оно быть включено.

Может кто-нибудь объяснить мне, почему следующее не работает?

<Property Id='UNINSTALLMODE' Value="FALSE"></Property>

<DirectoryRef Id="DATADIR">        
    <Component Id="C.RemoveDataFolder" Guid="myguid" KeyPath="yes">
        <util:RemoveFolderEx On="uninstall" Property="DATADIR" ></util:RemoveFolderEx>
        <Condition>(UNINSTALLMODE="TRUE")</Condition>
    </Component>
</DirectoryRef>

<CustomAction Id="CA.SetUninstallMode" Property="UNINSTALLMODE" Value="TRUE" />

<InstallExecuteSequence>
    <Custom Action="CA.SetUninstallMode" Before="WixRemoveFoldersEx" >(NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL")</Custom>
</InstallExecuteSequence>            

Я проверил журналы, и настраиваемое действие правильно устанавливает UNINSTALLMODE в «TRUE» при удалении программного обеспечения.При установке и переустановке это «ЛОЖЬ».Я пробовал настраиваемое действие, которое должно быть запланировано до = "WixRemoveFoldersEx" и до = "CostInitialise", которые имеют отношение к RemoveFoldersEx.

Любая помощь очень ценится, это сводит меня с ума!Neil


РЕДАКТИРОВАТЬ: я обновил wix для этого

<Property Id='P.INSTALLMODE' Value='0'></Property>
<Property Id='P.UNINSTALLMODE' Value='0'></Property>

<DirectoryRef Id="DATADIR">        
    <Component Id="C.RemoveDataFolder" Guid="myguid" KeyPath="yes">
        <util:RemoveFolderEx On="uninstall" Property="DATADIR" ></util:RemoveFolderEx>
        <Condition>(P.INSTALLMODE = 1) OR (P.UNINSTALLMODE = 1)</Condition>
    </Component>
</DirectoryRef>

<CustomAction Id="CA.SetInstallModeToTrue" Property="P.INSTALLMODE" Value='1' />
<CustomAction Id="CA.SetUninstallModeToTrue" Property="P.UNINSTALLMODE" Value='1' />

<InstallExecuteSequence>
    <RemoveExistingProducts Before="InstallInitialize" />            

    <Custom Action="CA.SetInstallModeToTrue" Before="ValidateProductID" >(NOT UPGRADINGPRODUCTCODE) AND (NOT PREVIOUSVERSIONSINSTALLED)</Custom>
    <Custom Action="CA.SetUninstallModeToTrue" Before="ValidateProductID" >(NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL")</Custom>
</InstallExecuteSequence>

Пользовательские действия запускаются сразу после считывания значения DATADIR из реестра и до CostInitialize.

Вот что происходит в следующих ситуациях

  • Установить -> условие выполнено и компонент установлен
  • Переустановить -> условие не выполнено, но компонентвсе еще деинсталлируется, а затем переустанавливается
  • Деинсталляция -> условие выполнено и компонент деинсталлирован

Все, что я могу из этого сделать, это то, что условие применимо только для процедуры установки и один разкомпонент установлен, невозможно наложить на него условие для удаления.


EDIT2: наконец-то все заработало, используя свойство для removefolderex, которое устанавливается пользовательским действием.Кажется, теперь просто.

<Property Id='P.REMOVEDATAFOLDER' Secure='yes' />

<DirectoryRef Id="DATADIR">        
    <Component Id="C.RemoveDataFolder" Guid="myguid" KeyPath="yes">
        <util:RemoveFolderEx On="uninstall" Property="P.REMOVEDATAFOLDER" />
    </Component>
</DirectoryRef>

<CustomAction Id="CA.SetDataFolder" Property="P.REMOVEDATAFOLDER" Value='[DATADIR]' />

<InstallExecuteSequence>           
    <Custom Action="CA.SetDataFolder" Before="ValidateProductID" >(NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL")</Custom>
</InstallExecuteSequence>  

1 Ответ

2 голосов
/ 24 ноября 2011

Условие компонента, содержащего элемент RemoveFolderEx, является False при установке. Это означает, что компонент не установлен. Если он не установлен, он, очевидно, также не будет удален. Следовательно, даже если для условия условие управления при удалении установлено значение True, центр сертификации не будет работать, поскольку не установлен компонент, от которого он зависит.

...