WiX Burn - определите, какие элементы уже установлены

У меня есть прожиговая установка, при которой пользователь может выбрать, какой из трех вариантов установить - каждый напрямую связан с одним из трех MsiPackages в цепочке, например:

<Chain>
  <MsiPackage SourceFile="..\ProductA\bin\Release\ProductA.msi"  InstallCondition="chkProductA" />
  <MsiPackage SourceFile="..\ProductB\bin\Release\ProductB.msi"  InstallCondition="chkProductA" />
  <MsiPackage SourceFile="..\ProductC\bin\Release\ProductC.msi"  InstallCondition="chkProductC" />
</Chain>

Все хорошо. Тем не менее, когда я в следующий раз запускаю msi, я хочу переустановить / обновить только те элементы, которые были выбраны изначально - то есть, если был выбран только productA, я не хочу устанавливать продукты B & C.

Как определить, что было выбрано изначально?

Ответы на вопрос(2)

Решение Вопроса

В конечном итоге все сводится к двум частям ...

а) установка ключа реестра в каждом из MSI продукта, которые устанавливаются при установке. Очевидно, что если MSI не был установлен изначально, то запись реестра не будет существовать. то есть

  <!-- registry entry to state that the item has been installed-->
  <Component Id="cmp_WriteToRegistry" Guid="[yourguid]">
    <RegistryKey Root="HKLM"
                 Key="Software\MyCompany]"
          Action="createAndRemoveOnUninstall">
      <RegistryValue Type="integer" Name="ProductA" Value="1" KeyPath="yes"/>
    </RegistryKey>
  </Component>

б) Проверка наличия этого ключа реестра в записи при обновлении ...

<!-- Determine what items are to be installed in the event of an install using the BA-->
<WixVariable Id="chkProductA" Value="![CDATA[chkProductA]]" />
<WixVariable Id="chkProductB" Value="![CDATA[chkProductB]]" />
<WixVariable Id="chkProductC" Value="![CDATA[chkProductC]]" />

<!-- Determine what items are installed in the event of an upgrade-->
<util:RegistrySearch Root="HKLM" Key="SOFTWARE\MyCompany" Value="ProductAInstalled" Variable="ProductAInstalled" Result="exists" />
<util:RegistrySearch Root="HKLM" Key="SOFTWARE\MyCompany" Value="ProductBInstalled" Variable="ProductBInstalled" Result="exists" />
<util:RegistrySearch Root="HKLM" Key="SOFTWARE\MyCompany" Value="ProductCInstalled" Variable="ProductCInstalled" Result="exists" />

<Chain>
  <MsiPackage SourceFile="..\SetupProductA\bin\Release\SetupProductA.msi"
              InstallCondition="chkProductA OR ProductAInstalled" />
  <MsiPackage SourceFile="..\SetupProductB\bin\Release\SetupProductB.msi"
              InstallCondition="(chkProductB) OR (ProductBInstalled)" />
  <MsiPackage SourceFile="..\SetupProductC\bin\Release\SetupProductC.msi"
              InstallCondition="(chkProductC) OR (ProductCInstalled)" />
</Chain>

</Bundle>

Таким образом, в InstallCondition chkProductA оценивается как true, когда используется пользовательский интерфейс, и установлен соответствующий флажок, а ProductAInstalled оценивается как true, когда соответствующий продукт уже установлен - заботясь об обновлении, которое в моем случае происходит без какого-либо взаимодействия с пользователем.

Легко, когда знаешь как. Я конечно не начал с ...

 BryanJ19 окт. 2012 г., 16:52
Ваше решение - как бы я это сделал. Это похоже на «Помните Свойство Шаблон»:robmensching.com/blog/posts/2010/5/2/...
 Brent01 авг. 2013 г., 20:13
 Fetchez la vache19 окт. 2012 г., 17:28
Спасибо, Брайан. Я все еще нахожусь в новичке / заново изобретаю стадию колеса, так что это приятно знать.
 Fetchez la vache19 окт. 2012 г., 15:50
Старый этикет повторения твоего собственного вопроса снова ... Если у кого-то есть лучший ответ, я был бы очень рад услышать его, как будто вышеприведенный ответ АН, он, возможно, не ЛУЧШИЙ. Если за неделю или около того не будет лучшего ответа, я выберу это в качестве ответа. Я не ловлю очки, поэтому думаю, что это правильно ...

рузки, вы можете сделать это в обработчике события DetectPackageComplete:

CustomBA_DetectPackageComplete(object sender, DetectPackageCompleteEventArgs e)
{
    if (e.PackageId == "SetupProductA" && e.State == PackageState.Present)
    {
        CustomBA.Engine.NumericVariables["chkProductA"] = 1;
    }
    etc...
}

Подобное можно сделать, чтобы обнаружить установленные функции, используяDetectMsiFeature.

При этом, я бы использовал этот метод, только если у вас уже есть собственный BA. Создание пользовательских БА являетсямного работы.

 dhiraj suvarna10 нояб. 2015 г., 21:12
Вы предлагаете сделать поиск в реестре в настраиваемом управляемом приложении Boostraper?
 Dave Andersen11 нояб. 2015 г., 21:52
@phoenix, вам не нужно выполнять поиск в реестре, если вы включили в свой пакет обновленную версию MSI. Механизм записи обнаружит существующий MSI на основе кода обновления соответствующей MSI в вашем комплекте и сгенерирует событие «DetectPackageComplete». Джон Райт написалхороший пример справиться с этим.

Ваш ответ на вопрос