如何使用补丁文件修改 CPack 生成的 WiX XML?

Posted

技术标签:

【中文标题】如何使用补丁文件修改 CPack 生成的 WiX XML?【英文标题】:How can one modify CPack generated WiX XMLs using a patch file? 【发布时间】:2018-06-12 23:58:42 【问题描述】:

我正在尝试添加功能以在安装某个安装程序的新版本之前卸载以前的版本。 CPackWIX 文档页面 (https://cmake.org/cmake/help/v3.3/module/CPackWIX.html) 不清楚如何使用 CPACK_WIX_PROPERTY_PROPERTY 或 CPACK_WIX_PATCH_FILE 来修改 CPack 生成的 WiX XML。假设 CPack 生成的 XML 中不存在以下内容。有没有办法使用补丁文件向它们添加以下内容?

<InstallExecuteSequence>
    <RemoveExistingProducts Before='InstallFinalize' />
</InstallExecuteSequence>

该文档展示了如何将环境元素添加到组件中。有没有办法可以扩展上述逻辑?

【问题讨论】:

【参考方案1】:

我遇到了和你一样的问题(卸载以前版本的包)并且在尝试使用 CPACK_WIX_PATCH_FILE 时遇到了一些麻烦,所以我想到了另一种解决方案:使用 CPACK_WIX_TEMPLATE 宏并将其设置为指向默认模板的修改版本。

默认模板可以在这里找到:https://github.com/Kitware/CMake/blob/master/Modules/WIX.template.in

我知道这并不理想,因为此文件可能会在 CMake 升级后发生变化。

但有趣的是,我意识到添加“RemoveExistingProducts”不起作用,因为这已经在默认模板文件中进行了处理(作为 MajorUpgrade 的一部分)。

对我来说真正的问题是 CPACK_WIX_UPGRADE_GUID 从未在我们的项目中设置,所以 CMake 总是生成一个新的(每个人都忽略了一个很好的警告),结果,所有安装程序看起来就像他们指的是不同的应用程序一样。

设置 CPACK_WIX_UPGRADE_GUID 后,安装旧版本会自动删除旧包。

但这不适用于尚未设置 CPACK_WIX_UPGRADE_GUID 的包。

【讨论】:

以上是关于如何使用补丁文件修改 CPack 生成的 WiX XML?的主要内容,如果未能解决你的问题,请参考以下文章

如何用 CPack 生成 WIX 包?

同时使用 CMAKE_INSTALL_PATH 和 CPack WiX 生成器

CPack 一次构建多个包的问题

如何使用 cpack/cmake 生成具有特定文件组织的 nuget 包?

git如何生成单个文件的补丁

CMake系列:WIX打包