如何使用bindpaths创建WiX补丁?

时间:2017-08-09 10:43:54

标签: cmake wix cpack

我正在使用cmake / cpack用WiX构建我的项目。

cmake运行heat.exe(或类似的东西),它以下列格式生成包含我项目文件的files.wxs:

我们假设在名为“bin”的文件夹中有一个名为a.txt的文件。该项目是在桌面上的NewFolder中构建的。

<DirectoryRef Id="CM_DP_bin">
    <Component Id="CM_CP_bin.a.txt" Guid="*">
        <File Id="CM_FP_bin.a.txt" Source="C:/Users/mindlessbot/Desktop/NewFolder/_CPack_Packages/WIX/packageName/bin/a.txt" KeyPath="yes"/>
    </Component>
</DirectoryRef>

创建MSI后,整个NewFolder将移动到不同的目录中(在我们的服务器上)。因此,当我尝试使用输出.wixpdb创建WiX补丁时,我收到以下错误:

error PYRO0103 : The system cannot find the file 'C:/Users/mindlessbot/Desktop/NewFolder/_CPack_Packages/WIX/packageName/bin/a.txt'

经过一些谷歌搜索,我发现.wixpdb包含对文件的引用,这些文件已经改变了位置,所以当然找不到它们。我找到了一个人provided the commands to use bindpaths的帖子,但是因为我使用的是cpack,所以我无法直接调用它们。

那我该怎么办呢?

其他一些信息:

我的项目包含多个wxs文件(不确定它是否有任何区别)

cpack命令是:

path/to/cpack.exe -G WIX --config path/to/config.cmake

patch命令单独运行:

torch.exe -p -xi path/to/oldInstaller.wixpdb path/to/newInstaller.wixpdb -out path/to/patch.wixmst
candle.exe path/to/patch.wxs -out path/to/patch.wixobj
light.exe path/to/patch.wixobj -out path/to/patch/wixmsp
pyro.exe path/to/patch.wixmsp -out path/to/patch.msp -t PatchBaselineID path/to/patch/wixmst

1 个答案:

答案 0 :(得分:0)

如果您想在一台计算机上构建MSI,但是在另一台计算机上构建补丁,我建议使用.wixout方法而不是依赖.wixpdb方法。 .wixout文件可以由用于构建MSI的同一WiX工具集CLI工具light.exe生成。 .wixout

可能会找到有关WiX工具集链接器light.exe的完整文档here。以下是使用light.exe构建.wixout文件的示例:

"C:\Program Files (x86)\WiX Toolset v3.11\bin\light.exe" "/path/to/Some.wixobj" "/path/to/Another.wixobj" "/path/to/AndYetAnother.wixlib" -bf -xo -out "/path/to/MyInstaller_v1.wixout"

现在让我们分解这些命令行参数的用途:

  • "/path/to/Some.wixobj" "/path/to/Another.wixobj" "/path/to/AndYetAnother.wixlib" - 这些是WiX源文件的编译输出,它们可以是.wixobj个文件(通过candle.exe生成)或.wixlib个文件(通过{{生成) 1}},一种将lit.exe文件合并到一个可共享库中的方法。
  • .wixobj - 此开关导致所有文件绑定 int到生成的-bf文件中。这样就无需在构建补丁时在目标计算机上拥有确切的文件夹结构,因为这些文件是使用.wixout文件携带的。
  • .wixout - 此开关告诉链接器输出MSI的XML表示,而不是实际的MSI。这是使用-xo开关。
  • 所必需的
  • -bf - 这告诉链接器输出-out "/path/to/MyInstaller_v1.wixout"文件的位置。

一旦您具有生成.wixout文件的功能,就可以修改.wixout命令以基于torch.exe文件而不是.wixout文件及其相关文件夹结构运行。以下是我如何修改.wixpdb命令以使用torch.exe文件而不是.wixout文件:

.wixpdb

所以,总而言之,我非常喜欢这种方法,通常我会使构建过程生成torch.exe -p -xi "path/to/oldInstaller.wixout" "path/to/newInstaller.wixout" -out "path/to/patch.wixmst".msi文件。这允许我们将安装程序的各种版本/版本缓存为.wixout文件,然后在各种版本的.wixout文件之间创建补丁的过程变得相对容易。