2016-10-21 2 views
1

У меня есть два продукта, которые я пытаюсь написать установщику. Оба продукта представляют собой пакеты wix, которые в качестве требования имеют третий комплект продуктов.Wix ExePackage Side by Side Установите без удаления

В идеале я хочу, чтобы случиться, когда вы установите один является:

  • Если Product3 не установлен, то оно должно быть.
  • Если продукт 3 установлен и установлен, версия выше или то же самое делает.
  • Если продукт 3 установлен и установлен, версия ниже, затем обновляется.
  • Если удаление и продукт1 или 2 все еще установлены, не удаляйте продукт3.

До сих пор я смог завоевать некоторые из этих пунктов, но не все одновременно.

Первоначально я попытался получить установленную версию с помощью ProductSearch и использовать InstallCommand. Однако я столкнулся с проблемами при удалении, когда вы выполняете бок о бок, потому что команда install больше похожа на «запрошенное состояние установки», и поэтому, если я не хочу, чтобы она была установлена, когда обнаруживает ту же версию, она фактически начинает ее удалять.

я смотрел на это аналогичный ответ:

How to avoid uninstalling previously installed ExePackage (redistributables) while installing a WiX Bundle?

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

Я просмотрел RelatedBundle, но я не уверен, что это то, что мне нужно. Похоже, что они более ориентированы на системы исправлений.

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

ответ

1

После многих проб и ошибок я выяснил, как заставить работу DependencyExtension работать.

В приведенном ниже примере ProductC представляет собой исполняемый файл Wix Bundle. Этот пакет включает файл MSI. Я использую productSearch для поиска кода обновления этого файла MSI (NOT THE BUNDLE), чтобы определить, установлен ли он.

В файле расслоении для проекта А и В:

<Wix xmlns:dep="http://schemas.microsoft.com/wix/DependencyExtension" 
    xmlns:util="http://schemas.microsoft.com/wix/UtilExtension"> 
    <Bundle> 
     <util:ProductSearch Id="ProductCInstallSearch" 
          UpgradeCode="{ProductC_MSI_UpgradeCode_GUID}" 
          Variable="ProductCInstalled" 
          Result="state"/> 
     <dep:Requires Id="ProductCRequired" ProviderKey="ProductC"/> 
     <Chain> 
      <PackageGroupRef Id="ProductC_pkg"/> 
     </Chain> 
    </Bundle> 
    <Fragment Id="Required_Pkgs"> 
     <PackageGroup Id="ProductC_Pkg"> 
      <ExePackage Id="ProductC_Bundle" 
         Permanent="no" 
         DetectCondition="NOT ProductCInstalled = 2" 
         InstallCommand="/quiet" 
         UninstallCommand="/uninstall /quiet"> 
       <dep:Provides Key="ProductC" 
           Version="0.0.0.0"> 
        <dep:RequiresRef Id="ProductCRequired"/> 
       </dep:Provides> 
      </ExePackage> 
     </PackageGroup> 
    </Fragment> 
</Wix> 

Теперь вы можете установить и B в любом порядке и при удалении продукта C будут удалены только тогда, когда последний удаляется.

Смежные вопросы