带有动态 MsiPackage 名称的 WiX Bundle

Posted

技术标签:

【中文标题】带有动态 MsiPackage 名称的 WiX Bundle【英文标题】:WiX Bundle with dynamic MsiPackage names 【发布时间】:2013-09-06 00:31:32 【问题描述】:

我正在将我们当前的单片安装程序转换为使用 WiX 3.7 捆绑包/链。我们有几个组件现在正在构建到它们自己的可单独维护的 MSI 安装程序中。我的下一个任务是将所有这些添加到引导加载程序/引导链程序中,但我遇到了障碍。

我们的个人安装程序的一个要求是它们在文件名中包含版本(即 MyApplication-5.4.22.msi)。我没有看到像 Heat 这样的工具可以将 MSI 包收集在一起,我也没有看到添加带有通配符的 MsiPackage 元素来说明不同的包名称的方法。

作为最后的手段,我可​​以将捆绑器包装在另一个 MSBuild 脚本中,该脚本将“自动完成”文件名并将路径作为变量传递给捆绑器。我希望有人可以推荐一个直接在 wxs 或 wixproj 设置中工作的解决方案。

【问题讨论】:

【参考方案1】:

如果 msi 文件是使用 WiX 设置项目构建的,则 WiX Bootstrapper 项目可以引用它们,从而创建有用的 WiX 变量,这些变量被定义为 msi 文件的路径。

查看我的答案here,以及变量列表here。

如果不是这种情况,那么您可以编写一些运行before Build 目标的 MSBuild 目标,以找出实际的文件路径。如果可用的标准和社区 MSBuild 任务不足,您可以编写 your own tasks,通过创建程序集或使用 inline code。 (当然,总是有Exec 任务可以输出到像 cmd.exe 这样的命令行程序,之后您可以解析其输出以提取 msi 路径。)

【讨论】:

安装程序是预先构建的,所以我不能简单地引用他们的 wixproj 文件。目前我正在为每个安装程序创建一个 MSBuild ItemGroup,以便我可以使用内置的通配符功能。据我所知,将版本放在 msi 文件名中是一种相当标准的做法,所以我希望 WiX 能够为自动化这个过程提供某种支持。 我看不出 WiX 能比使用 MSBuild ItemGroup 更简洁地做到这一点,而且复制 MSBuild 没有任何意义。 我认为你是对的。我希望避免通过 DefineConstants 将多个变量传递到 WXS 文件中的麻烦。我只能想象这会让未来的维护者感到困惑,但这确实是最直接的方法。我希望 wxs 文件可以直接访问 msbuild 属性。 是的,我同意。许多开发人员从未想过要查看项目文件。我在构建前事件中给它们留下了提示,例如“REM 在项目文件中查找构建自定义”;也可以使用 ECHO 代替 REM。或者,您可以使用 MSBuild 导入,以便自定义位于可以添加的外部文件中,以便在项目中可见。 (缺点是 VS 在重新加载项目之前不会应用对文件所做的任何更改。)

以上是关于带有动态 MsiPackage 名称的 WiX Bundle的主要内容,如果未能解决你的问题,请参考以下文章

Wix/Burn - 不运行 MSIPackage 的条件,因此不卸载应用程序

MsiPackage - 属性“缓存”的含义

WiX 安装程序:修改安装以包括在初始安装时跳过的包

如何使用 Burn Bootstrap 应用程序安装本地化的 MsiPackage

在 WIX 中运行时为快捷方式动态分配名称

Wix Burn exepackage 属性