威克斯安装有共同的部件(wix installers with common component)

2019-10-21 17:38发布

我有web应用程序,这是我要安装IIS。 此应用程序支持的插件架构。 它包括:

  1. 核心部分
  2. Plugin的一个
  3. 插件的使用b

我想有2个安装程序(MSI)。 一个用于插件A和其他的插件B.每个安装程序还应该安装核心部分。 所以,如果我的插件运行安装程序应该安装核心部分和Plugin的一个二进制文件。 然后,如果我在插件的使用b安装程序应该只安装插件的使用b二进制文件。 但是,如果插件去运行安装程序为首先它应该安装核心部分和插件的使用b二进制文件。

我用维克斯合并模块项目的核心部分,并创造了2个WiX的项目,每个安装。 但是,因为我想不工作。

这是如何工作的:

  1. 我运行安装程序插件A(正常工作)
  2. 我运行安装程序插件B,其检测产品已安装,显示删除,修复,变更页
  3. 我选择更改,我看到“插件A”上树的特点,而不是“插件B”

你可以在这里看到样品溶液: https://github.com/bwojdyla/wixplugins工程在调试配置。 维克斯3.9,VS2012

我的合并模块(核心部分):

<?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>

插件答:

<?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>

插件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的功能,我应该使用,来实现这一目标?

Answer 1:

Windows安装程序识别和引用计数通过他们的GUID组件; 所以基本上你需要做的是确保公共部分组件(“核心”)中都包含产品相同的组件GUID。 即原则上,你可以不必通过创建一个合并模块实现这一点,但例如通过#包括了代号为“核心”部分为两个模块。 不管怎么说,合并模块是好的 - 它基本上或多或少同样的事情。

什么是重要的,你应该有不同的产品标识和包装的ID为PluginA和PluginB,否则它们看起来是一样的Windows安装程序(它标识由它安装的产品的GUID)。 现在,当你试图装B就认为它实际上被卸载一个,所以你得到这个消息。

所以,你可以尝试改变你的产品A / B的文件是这样的(注意,我还省略了“包标识” - 这是自动生成的,基本上所有的MSI应该有不同的包装IDS)。

产品A

  <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引用计数:两个产品安装相同的MSI



Answer 2:

在这些情况下都始终包安装的核心部分。 这是正常的情况。 你不希望在情况下,你安装和芯,然后没有核心装B,因为卸载会除去那B被使用的核心。 其核心是在这两个如此裁判计数意味着你可以同时安装,然后卸载一个核心依然存在。 所有当安装在A B出现这种情况要么是没有(因为该文件版本是一样的,他们是在相同的位置)或某些文件被更新(因为最后安装的插件已经更新的文件版本,在公共场所)。 由于尼古拉说,你安排这一切由具有单核心部分(如添加到两个的MSI合并模块)或另有确保基础上的组件GUID的共享是正确的工作。



文章来源: wix installers with common component