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

时间:2015-03-18 11:50:53

标签: wix windows-installer

我正在使用Wix 3.9并让它构建3个MSI文件,然后是一个包含每个MSI文件的Bundle。我已使用herehere所述的技术将主要安装程序项目升级为自动在MSI文件名中包含版本号。我的Wix项目中的我的BeforeBuild任务如下(来自第二个链接)

<!-- 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文件?

2 个答案:

答案 0 :(得分:0)

这是一种方式......

修改生成MyMsiFile MSI文件的项目,以生成MyMsiFile.wxs,该MyMsiFile.wxs定义包含该包及其当前名称的PackageGroup

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

此方法详细了解MSI项目中的MSI包,远离捆绑项目。

答案 1 :(得分:0)

我最终总是避开这个问题。我更改了我的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>