Для обновления Wix Burn необходимо удалить оба MSI перед обновлением.

У меня есть два MSI; framework.msi и product.msi. framework.msi устанавливает dll в GAC, от которого зависит product.msi как при установке, так и при удалении.

Я создал BA, который связывает два MSI вместе.

<Bundle ...>
  <Chain>
    <PackageGroupRef Id='framework'/>
    <PackageGroupRef Id='product'/>
  </Chain>
</Bundle>
<Fragment>
  <PackageGroup Id="framework">
    <MsiPackage Name="Product Framework"
                ForcePerMachine="yes"
                SourceFile="framework.msi"
                Vital="yes"
                Cache="no"
                Permanent="no"
                Compressed="yes"
                Visible="yes"/>
  </PackageGroup>
  <PackageGroup Id="product">
    <MsiPackage Name="Product"
                ForcePerMachine="yes"
                SourceFile="product.msi"
                Vital="yes"
                Cache="no"
                Permanent="no"
                Compressed="yes"
                Visible="yes"/>
  </PackageGroup>
</Fragment>

Для новых установок мои framework.msi и product.msi устанавливаются правильно. Когда я перехожу на новую версию, она успешно обновляет framework.msi. Затем он продолжает удаление product.msi, но это не удается (для этой ошибки: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.IO.FileNotFoundException: Could not load file or assembly 'CheckInstaller, Version=1.0.0.0' or one of its dependencies. The system cannot find the file specified.), поскольку удаление CustomAction ссылается на версию сборки (CheckInstaller), которой больше нет в GAC (поскольку она была обновлена ​​как часть обновления framework.msi). .

Без необходимости писать собственный BA я хочу иметь возможность сделать что-то вроде этого:

// pseudo code
if(product.Exists() && framework.Exists())
{
  product.Uninstall(); // product is dependent on the framework
  framework.Uninstall();
}
framework.Install();
product.Install();

Я понимаю, что это было бы возможно, если бы мы объединили два MSI в один большой продукт, но поскольку мы распределяем framework.msi по другим командам и по разным другим причинам, их нужно держать отдельно.

Возможно ли то, что я хочу сделать, с помощью загрузчика WiX?


person Brett Wertz    schedule 16.05.2013    source источник


Ответы (1)


Сегодня с Burn это невозможно. Цепь фиксируется. При установке он работает в прямом направлении, при удалении - в обратном. Я могу представить себе два варианта, доступных сегодня:

  1. Не заставляйте MSI обновлять друг друга и позволяйте удалять старые MSI, когда новый Bundle удаляет старый Bundle.

  2. Избегайте создания зависимостей времени установки между пакетами. Как правило, это хорошая вещь в любом случае.

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

person Rob Mensching    schedule 16.05.2013