如何在 Wix 包中引用动态命名的 MSI 文件

How do I reference a Dynamically named MSI file in a Wix Bundle

我正在使用 Wix 3.9 并让它构建 3 个 MSI 文件,然后构建一个包含每个 MSI 文件的捆绑包。我已经使用 here and here 中描述的技术升级了主安装程序项目以自动在 MSI 文件名中包含版本号。我的 Wix 项目中的 BeforeBuild 任务如下(从第二个 link)

<!-- Set Output file name to include version-->
<Target Name="BeforeBuild">
  <GetAssemblyIdentity AssemblyFiles="$(SolutionDir)WindowsClient\bin$(Configuration)\MyApp.exe">
    <Output TaskParameter="Assemblies" ItemName="AssemblyVersions" />
  </GetAssemblyIdentity>
  <CreateProperty Value="$(OutputName)%(AssemblyVersions.Version)">
    <Output TaskParameter="Value" PropertyName="TargetName"/>
  </CreateProperty>
  <CreateProperty Value="$(TargetName)$(TargetExt)">
    <Output TaskParameter="Value" PropertyName="TargetFileName"/>
  </CreateProperty>
  <CreateProperty Value="$(TargetDir)$(TargetFileName)">
    <Output TaskParameter="Value" PropertyName="TargetPath"/>
  </CreateProperty>
</Target>`

但这导致我的包在以下行失败。

<MsiPackage Id="MyMsiFile" Name="$(var.WixInstaller.TargetFileName)" SourceFile="$(var.WixInstaller.TargetDir)"/>

它没有说找不到文件 MyMsiFile.msi,这是真的,因为它现在被命名为 MyMsiFile1.0.1.msi。如何在 Bundle 文件中引用具有动态名称的 MSI 文件?

这是一种方法……

修改生成 MyMsiFile MSI 文件的项目,使其也生成一个 MyMsiFile.wxs,它定义一个 PackageGroup,其中包含该包的当前名称。

然后对于需要它的捆绑项目,将 MyMsiFile.wxs 添加为 linked 文件,并在他们的捆绑链中,使用 PackageGroupRef.

引用 MSI

此方法将 MSI 包的详细信息保留在 MSI 项目中,远离捆绑项目。

最后我一起回避了这个问题。我更改了我的 msi 项目以复制 msi 并将版本号附加到副本。通过这种方式,我得到了一个带有版本号的 msi 文件和一个没有版本号的文件,用于捆绑到更完整的安装程序中。我删除了上面发布的 BeforeBuild 代码并将其替换为

<Target Name="AfterBuild">
  <GetAssemblyIdentity AssemblyFiles="$(SolutionDir)WindowsClient\bin$(Configuration)\MyApp.exe">
    <Output TaskParameter="Assemblies" ItemName="AssemblyVersions" />
  </GetAssemblyIdentity>
  <Copy SourceFiles=".\bin$(Configuration)$(OutputName).msi" DestinationFiles=".\bin$(Configuration)$(OutputName)%(AssemblyVersions.Version).msi" />
</Target>