我正在使用Wix 3.9并让它构建3个MSI文件,然后是一个包含每个MSI文件的Bundle。我已使用here和here所述的技术将主要安装程序项目升级为自动在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文件?
答案 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>