我正在使用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
答案 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
文件之间创建补丁的过程变得相对容易。