2015-01-31 2 views
1

У меня есть веб-приложение, которое я хочу установить на IIS. Это приложение поддерживает архитектуру плагинов. Он состоит из:wix-установщики с общим компонентом

  1. Основная часть
  2. плагин A
  3. плагин B

Я хочу иметь 2 монтажников (МСИ). Один для плагина A и других для плагина B. Каждый установщик также должен установить Core Part. Поэтому, если я запустил установщик для плагина A, он должен установить двоичные файлы Core Part и Plugin A. Затем, если я запустил Installer для плагина B, он должен установить только двоичные файлы Plugin B. Но если запустить установщик для плагина B сначала, он должен установить двоичные файлы Core Part и Plugin B.

Я использовал проект WiX Merge Module для Core Part и создал 2 проекта WiX для каждого установщика. Но это не работает, как я хочу.

Вот как это работает:

  1. Я бегу установки для плагинов А (отлично работает)
  2. бегаю установки для плагинов B, он обнаруживает, что продукт уже установлен, показывает Удалить, Ремонт, Изменить страница
  3. Я выбираю Изменить и я вижу «Plugin а» на особенности дерева вместо «Plugin B»

Вы можете увидеть образец решения здесь: https://github.com/bwojdyla/wixplugins Works в конфигурации отладки. Wix 3,9, VS2012

модуль My слияния (основной части):

<?xml version="1.0" encoding="UTF-8"?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 
    <Module Id="CoreModule" Language="1033" Version="1.0.0.0"> 
     <Package Id="751e70eb-cf76-413b-b8c8-231a31f9c946" Manufacturer="test" InstallerVersion="200" /> 

    <Directory Id="TARGETDIR" Name="SourceDir"> 
     <Directory Id="INSTALLFOLDER" Name="PluginInstaller"> 
     <Component Id="CoreComp" Guid="{161F78E1-0ABD-4FCD-92FC-6095A45F78B3}"> 
      <File Id="CoreFile" KeyPath="yes" Source=".\Core.txt" /> 
     </Component> 
     </Directory> 
    </Directory> 
    </Module> 
</Wix> 

Плагин A:

<?xml version="1.0" encoding="UTF-8"?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 
    <Product Id="{8E93D1E7-C05F-40A0-B737-C053C1EE3E0A}" Name="PluginInstaller" Language="1033" Version="1.0.0.0" Manufacturer="test" UpgradeCode="eed33233-e773-45c2-87a1-ab349191a30a"> 
     <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" Id="{9C7D28B4-FBAD-4FE6-A204-8F6A11D89792}"/> 

     <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." /> 
     <Media Id="1" Cabinet="Cab1.cab" EmbedCab="yes" /> 

    <UIRef Id="WixUI_FeatureTree"/> 

    <FeatureRef Id="ProductFeature"> 
     <Feature Id="PluginA" Title="Plugin A" Level="1" AllowAdvertise="no"> 
     <ComponentGroupRef Id="ProductComponents" /> 
     </Feature> 
    </FeatureRef> 
    </Product> 

    <Fragment> 
     <Directory Id="TARGETDIR" Name="SourceDir"> 
      <Directory Id="ProgramFilesFolder"> 
       <Directory Id="INSTALLFOLDER" Name="PluginInstaller" /> 
     <Merge Id="CoreModule" Language="1033" SourceFile="..\CoreModule\bin\Debug\CoreModule.msm" DiskId="1" /> 
      </Directory> 
     </Directory> 
    </Fragment> 

    <Fragment> 
     <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER"> 
     <Component Id="PluginAComp" Guid="{7641AF10-B2EF-4639-A0B4-34AE819CAD38}"> 
     <File Id="PluginAFile" KeyPath="yes" Source=".\PluginA.txt" /> 
     </Component> 
     </ComponentGroup> 
    </Fragment> 
</Wix> 

Plugin B:

<?xml version="1.0" encoding="UTF-8"?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 
    <Product Id="{8E93D1E7-C05F-40A0-B737-C053C1EE3E0A}" Name="PluginInstaller" Language="1033" Version="1.0.0.0" Manufacturer="test" UpgradeCode="eed33233-e773-45c2-87a1-ab349191a30a"> 
    <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" Id="{9C7D28B4-FBAD-4FE6-A204-8F6A11D89792}"/> 

    <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." /> 
    <Media Id="1" Cabinet="Cab1.cab" EmbedCab="yes" /> 

    <UIRef Id="WixUI_FeatureTree"/> 

    <FeatureRef Id="ProductFeature"> 
     <Feature Id="PluginB" Title="Plugin B" Level="1" AllowAdvertise="no"> 
     <ComponentGroupRef Id="ProductComponents" /> 
     </Feature> 
    </FeatureRef> 

    </Product> 

    <Fragment> 
    <Directory Id="TARGETDIR" Name="SourceDir"> 
     <Directory Id="ProgramFilesFolder"> 
     <Directory Id="INSTALLFOLDER" Name="PluginInstaller" /> 
     <Merge Id="CoreModule" Language="1033" SourceFile="..\CoreModule\bin\Debug\CoreModule.msm" DiskId="1" /> 
     </Directory> 
    </Directory> 
    </Fragment> 

    <Fragment> 
    <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER"> 
     <Component Id="PluginBComp" Guid="{D11704D9-9911-483A-B204-B2171DCB0E67}"> 
     <File Id="PluginBFile" KeyPath="yes" Source=".\PluginB.txt" /> 
     </Component> 
    </ComponentGroup> 
    </Fragment> 
</Wix> 

Или, может быть, есть другая особенность Wix , который я должен использовать, чтобы достичь этого?

ответ

0

Установщик Windows идентифицирует и ссылается на компоненты по их идентификатору GUID; поэтому в основном вам нужно убедиться, что компоненты общей части («ядро») включены в оба продукта с теми же компонентами. То есть в принципе вы могли бы добиться этого не обязательно, создав модуль слияния, но, например, путем # включения кода для «основной» части в оба модуля. В любом случае, модуль слияния в порядке - он в основном делает более или менее то же самое.

Важно то, что вы должны иметь разные идентификаторы продуктов и идентификаторы пакетов для PluginA и PluginB, иначе они будут выглядеть одинаково с установщиком Windows (он определяет продукт, устанавливаемый его направляющим). Теперь, когда вы пытаетесь установить B, он думает, что на самом деле это A, и вы получите это сообщение.

Таким образом, вы можете попробовать изменить ваши файлы A/B продукта, подобные этому (обратите внимание, что я также пропустил «packageid» - он автогенерируется, и в основном все MSI должны иметь разные идентификаторы пакетов).

Продукт А

<Product Id="{4D7828A0-F55C-4D26-9AA9-914FF646C55E}" Name="PluginInstallerA" Language="1033" Version="1.0.0.0" Manufacturer="test" UpgradeCode="eed33233-e773-45c2-87a1-ab349191a30a"> 
     <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" /> 

Продукт B

<Product Id="{E052B5C0-BB4D-4848-844C-2293059E9465}" Name="PluginInstallerB" Language="1033" Version="1.0.0.0" Manufacturer="test" UpgradeCode="eed33233-e773-45c2-87a1-ab349191a30a"> 
    <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" /> 

Здесь подсчет ссылок это объяснено в деталях: MSI Reference Counting: Two products install the same MSIs

0

В этих ситуациях оба пакета всегда устанавливать основную часть. Это нормальная ситуация. Вы не хотите находиться в ситуации, когда вы устанавливаете A и ядро, а затем устанавливаете B без ядра, потому что удаление A затем удалит ядро, которое использует B. Ядро находится в обоих случаях, поэтому подсчет ссылок означает, что вы можете установить оба, а затем удалить один, и ядро ​​все равно будет там. Все, что происходит, когда B установлено поверх A, ничто (поскольку версии файлов одинаковы и находятся в одних и тех же местах), или некоторые файлы обновляются (поскольку последний установленный плагин обновил версии файлов в общем месте). Как говорит Николай, вы соглашаетесь на все это, имея одну основную часть (как в модуле слияния, добавленную к обеим MSI), или иным образом гарантируя правильность совместного использования на основе компонентов.

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