【问题标题】:Understanding PackageCode, ProductCode and UpgradeCode of WIX with multi instances了解多实例 WIX 的 PackageCode、ProductCode 和 UpgradeCode
【发布时间】:2016-04-27 14:07:57
【问题描述】:

只有当我使用相同的 msi 文件时,我的多实例 msi 设置才能工作。那么用户

  • 可以更改目录
  • 如果是新目录,则安装新实例
  • 如果它是现有目录,则更新实例
  • 每个实例都有自己的卸载程序条目

如果我使用新版本的设置并运行更新,那么

  • 已注册第二个具有相同显示名称的卸载程序
  • 新设置的第二个开始在维护模式下。没有 可以选择目录。其他实例的更新是 不可能。

阅读后关注博客条目 http://blogs.msdn.com/b/pusu/archive/2009/06/10/understanding-msi.aspx

我对 PackageCode、ProductCode(每个实例)和 升级代码。它按预期工作。但我收到了一个很大的警告 建筑。我可以忽略这个吗?这是正确的解决方案吗?

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
    <Product Id="*" Language="1033" Manufacturer="i-net software GmbH" Name="i-net Test"
        UpgradeCode="02c7fa01-5143-38ed-b923-2c2aaff301ae" Version="8.0.0.507">
        <Package Comments="i-net Test Server" Compressed="yes" Id="c748d2f0-9ca5-3cbc-be9a-730c6d621f00"
            InstallScope="perUser" />
        <Media Cabinet="media1.cab" EmbedCab="yes" Id="1" />
        <InstanceTransforms Property="INSTANCE_ID">
            <Instance Id="Instance_0" ProductCode="c748d2f0-9ca5-3cbc-be9a-730c6d621f00" UpgradeCode="c748d2f0-9ca5-3cbc-be9a-730c6d621ff3" />
            <Instance Id="Instance_1" ProductCode="c748d2f0-9ca5-3cbc-be9a-730c6d621f01" UpgradeCode="4c8e1670-9d04-3dce-b88a-1a4dbbbc976d" />
            <Instance Id="Instance_2" ProductCode="c748d2f0-9ca5-3cbc-be9a-730c6d621f02" UpgradeCode="b76f160d-9395-3eda-a13d-d0566379ca8f" />
        </InstanceTransforms>
        <MajorUpgrade AllowDowngrades="yes" />
        <Directory Id="TARGETDIR" Name="SourceDir">
            <Directory Id="ProgramFilesFolder">
                <Directory Id="INSTALLDIR" Name="i-net Test" />
            </Directory>
        </Directory>
        <DirectoryRef Id="INSTALLDIR">
            <Directory Id="Server" Name="Server">
                <Component Guid="d62d7bcb-9242-39da-a43a-015df0f965af" Id="Server_Comp" MultiInstance="yes">
                    <CreateFolder />
                    <File Id="Server_testBuilds.jar" Name="testBuilds.jar" Source="..\testBuilds.jar" />
                </Component>
            </Directory>
            <Component Guid="1543477d-59fc-3ec3-bb67-a541abd9cfba" Id="instance_path" MultiInstance="yes">
                <RegistryKey ForceDeleteOnUninstall="yes" Id="instance_path_reg"
                    Key="Software\i-net software GmbH\i-net Test\Instances\[INSTANCE_NUMBER]" Root="HKLM">
                    <RegistryValue Type="string" Value="[INSTALLDIR]" />
                </RegistryKey>
            </Component>
        </DirectoryRef>
        <Property Id="INSTANCE_ID" Value="NotSet" />
        <Property Id="InstancesCount" Value="3" />
        <CustomAction Id="SetInstanceID" Script="vbscript">...</CustomAction>
        <InstallUISequence>
            <Custom Action="SetInstanceID" Before="ExecuteAction" />
            <Custom Action="SetTransforms" After="SetInstanceID">ACTION = "INSTALL"</Custom>
        </InstallUISequence>
        <InstallExecuteSequence>
            <Custom Action="SetInstanceID" Before="ValidateProductID" />
            <Custom Action="SetProductName" After="SetInstanceID">PRODUCT_NAME</Custom>
        </InstallExecuteSequence>
        <CustomAction Id="SetTransforms" Property="TRANSFORMS" Value="{:[INSTANCE_ID];}[TRANSFORMS]" />
        <CustomAction Id="SetProductName" Property="ProductName" Value="[PRODUCT_NAME]" />
        <Feature Id="MainApplication">
            <ComponentRef Id="Server_Comp" />
            <ComponentRef Id="instance_path" />
        </Feature>
    </Product>
</Wix>

您可以在 https://github.com/i-net-software/SetupBuilder/blob/master/src/com/inet/gradle/setup/msi/MultiInstance.vbs 找到 SetInstanceID 操作

在我对 ProductCode 使用“*”之前(全局和每个实例)和 仅对 UpgradeCode(全局和每个实例)进行了硬编码。

【问题讨论】:

    标签: wix windows-installer multiple-instances


    【解决方案1】:

    实际上,MajorUpgrade 元素确实适用于多个实例。生成的实例转换将升级表的所有行替换为相同的新行,但 UpgradeCode 除外,它被该实例自己的 UpgradeCode 替换。如果您从 MSI 中提取实例转换(使用 SDK 中的 MsiDb.exe 工具提取子存储,这些子存储与 Instance/@Id 值命名相同,以便通过将它们应用于 MSI 来查看它们的实际效果在逆戟鲸)。

    【讨论】:

      【解决方案2】:

      解决方案错误。每次构建都必须更改 PackageCode 和 ProductCode。否则更新无法正常工作。这对单个实例有效,但对多个实例 msi 文件也有效。

      多个实例的问题是MajorUpgrade element 不适用于多个实例。如果您使用 Orca 检查生成的 msi 文件,您只会看到一个带有来自 Product Element 的 UpgradeCode 条目。您的实例中的 UpgradeCodes 不在此表中侦听。要解决此问题,您必须手动将 UpgradeCodes 添加到此表中:

      <Property Id="InstancesCount" Value="3"/>
      <InstanceTransforms Property="INSTANCE_ID">
        <Instance Id="Instance_0" ProductCode="*" UpgradeCode="GUID_0"/>
        <Instance Id="Instance_1" ProductCode="*" UpgradeCode="GUID_1"/>
        <Instance Id="Instance_2" ProductCode="*" UpgradeCode="GUID_2"/>
      </InstanceTransforms>
      <Upgrade Id="GUID_0">
        <UpgradeVersion MigrateFeatures="yes" Minimum="0.0.0.0" Property="WIX_UPGRADE_DETECTED_0"/>
      </Upgrade>
      <Upgrade Id="GUID_1">
        <UpgradeVersion MigrateFeatures="yes" Minimum="0.0.0.0" Property="WIX_UPGRADE_DETECTED_1"/>
      </Upgrade>
      <Upgrade Id="GUID_2">
        <UpgradeVersion MigrateFeatures="yes" Minimum="0.0.0.0" Property="WIX_UPGRADE_DETECTED_2"/>
      </Upgrade>
      

      如果您删除了MajorUpgrade element,那么您还必须添加:

      <InstallExecuteSequence>
        <RemoveExistingProducts After="InstallValidate"/>
      </InstallExecuteSequence>
      

      这只能添加一次,并且会从 MajorUpgrade 中自动添加。更新表中的默认属性名称是 WIX_UPGRADE_DETECTED。我们需要为每个实例使用一个单独的名称。我用“_”作为后缀。但其他一切都是可能的。

      如果我们使用 Orca 查看更新表,我们现在可以看到所有更新代码。但是有一个新问题。如果我们安装第二个实例,则 MSIEXEC 在操作 FindRelatedProducts 中找到此 UpgradeCodes 之一的安装,并在 RemoveExistingProducts 中将其卸载。我们只能安装一个实例。所有以前的实例都被删除。

      在 FindRelatedProducts 和 RemoveExistingProducts 动作之间,我们需要清除其他实例的 WIX_UPGRADE_DETECTED_xx 属性。只有当前实例的 UpdateCode 必须存在。我用一个小的 vbscript 动作做到了这一点:

      <CustomAction Id="SetInstanceID" Script="vbscript">
      InstancesCount = Session.Property( "InstancesCount" ) 
      For i = 0 To InstancesCount - 1
          If CStr(i) &lt;&gt; instanceNumber Then
              Session.Property( "WIX_UPGRADE_DETECTED_" &amp; i ) = ""
          End If
      Next
      </CustomAction>
      

      现在只有当前实例在 RemoveExistingProducts 中已经存在时被移除。

      【讨论】:

      猜你喜欢
      • 2011-07-01
      • 1970-01-01
      • 2019-08-16
      • 2014-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-15
      • 1970-01-01
      相关资源
      最近更新 更多