我需要将整个目录打包到使用Wix构建的MSI文件中。
该目录位于非本地(用于构建脚本等)位置,例如C:\path\to\baz
。
目的是将目录以%ProgramFiles%\foobar\baz
的形式安装在目标主机(打算在其中运行MSI的主机)上,这是我正在开发的软件的依赖项。
Wix的heat
程序似乎是为这项工作而设计的-收集目录(baz
)的内容并生成Wix源文件。我将其运行为:
heat.exe dir C:/path/to/baz -gg -dr baz -srd -cg baz baz.heat.wxs
问题在于,heat
将SourceDir\
附加到它所找到的每个文件的路径中:
<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
<DirectoryRef Id="baz" />
</Fragment>
<Fragment>
<ComponentGroup Id="electron">
<Component Id="cmp9C432873A67498F6C219E9E15596F0D8" Directory="baz" Guid="33D27AF6-A2E4-459C-818B-876268705883">
<File Id="filE773982796F85DF928701AF071140DE5" KeyPath="yes" Source="SourceDir\api-ms-win-core-console-l1-1-0.dll" />
</Component>
<!-- Other Component and nested File elements omitted. -->
</ComponentGroup>
</Fragment>
<Wix>
我不确定为什么这样做,我也知道还有诸如绑定器变量和其他类型的变量之类的东西,但是无论如何,Wix链接器不会汇编MSI,因为它无法获取生成的源中指定的文件XML文件:
baz.heat.wxs(12) : error LGHT0103 : The system cannot find the file 'SourceDir\api-ms-win-core-console-l1-1-0.dll'
我同时链接了由heat
生成的源文件和我称之为“主”源文件的文件,该文件实际上定义了已安装的功能以及baz
目录的位置被安装:
<?xml version="1.0" encoding="utf-8" ?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Name="Foobar" Manufacturer="Acme" Id="2c05b2af-3adf-4901-b126-5a839c67978d" UpgradeCode="6db7d46b-5152-4e67-9615-c3f3c4dc205c" Language="1033" Codepage="1252" Version="7.0.0">
<Package Id="*" Description="Acme Foobar Installer" Languages="1033" SummaryCodepage="1252" Compressed="yes" InstallerVersion="200" Keywords="Installer" Manufacturer="Acme" />
<MediaTemplate EmbedCab="yes" />
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="INSTALLDIR" Name="Foobar">
<Directory Id="baz" Name="baz" />
</Directory>
</Directory>
</Directory>
<Feature Id="lanthir" Level="1">
<ComponentGroupRef Id="baz" />
</Feature>
</Product>
我想知道:
SourceDir
还有其他内容吗?heat
生成可以按原样链接而没有问题的正确路径或使链接器工具(light
)解析由{{1}生成的路径的规范方法是什么? }是默认设置?我感觉自己正在解决一个非常简单和常见的问题,对此应该有一个非常知名和显而易见的解决方案。我希望为链接器提供一个变量,这样,当我需要嵌入的目录的实际路径发生更改时,就不必重新生成源文件。
答案 0 :(得分:0)
您需要在加热时使用-var命令行开关。它将用$(var.WhatYouYouPutAfterTheVarArg)代替SourceDir。
例如
heat.exe dir C:/path/to/baz -gg -dr baz -srd -cg baz -var var.BazDir baz.heat.wxs
应该会导致类似
<File Id="filE773982796F85DF928701AF071140DE5" KeyPath="yes" Source="$(var.BazDir)\api-ms-win-core-console-l1-1-0.dll" />
然后,您需要为BazDir设置一个值。我倾向于通过更新wixproj文件来做到这一点
<PropertyGroup>
<ProjectDefineConstants>BazDir=PathToBazDirectory;$(ProjectDefineConstants)</ProjectDefineConstants>
</PropertyGroup>