如何在 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>
我正在使用 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 文件和一个没有版本号的文件,用于捆绑到更完整的安装程序中。我删除了上面发布的 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>