我的公司最近强迫我们使用Wix Toolset (v.4.0.12),因为我们升级到Visual Studio 2012,不幸的是不再包含安装程序项目。
我的问题如下。我有一个很大的解决方案,有许多项目,所有这些都导致一个exe文件,和几个dll。
然后在解决方案中创建一个Wix安装项目,并向生成exe文件的项目添加引用。在该项目参考的属性中,我设置了Harvest: true
和Project Output Groups: Binaries
。
我希望我的WiX项目的构建能够从引用的项目中获取依赖项,这样我就不需要手动添加引用,因为这会给我带来更多的维护。
此外,如果我在引用的项目文件上运行heat.exe
,我只得到文件的exe输出,而不是项目所依赖的dll。
我认为以上是非常标准的,并且wix工具应该能够为我收集这些信息。我真的很奇怪,为什么在网上广泛搜索后,找不到任何有类似问题的人。
如果有人知道上面的原因,请试着给我发一个关于如何使用WiX做事情的基本教程。
WiX v3.6及以后版本支持VS2012。WiX v4.0刚刚启动,不建议在这个时候使用。在v4.0中会有很多突破性的变化,所以坚持使用v3。
Votive的自动收集功能不全。这就是为什么它在默认情况下是禁用的。发现许多项目类型都打破了它。正如您所发现的,收集不会遍历多个项目引用。这些都需要更多的工作才能正常工作。
同时可以在Component
元素中列出File
元素
不知道你是如何使用v4.0.12,当它甚至还没有出来!:) Wix v3.8是最新版本:http://wixtoolset.org/releases.
在官方文档中有大量的指南,你也可以在教程中找到相当多的信息。
但是,对于您的具体情况,您需要手动将每个项目的输出及其依赖项包含到安装程序中,因为目前还不支持自动收集:
<Component>
<File Id="ProjectA.Output"
Name="$(var.ProjectA.TargetFileName)"
Source="$(var.ProjectA.TargetPath)"
KeyPath="yes" />
</Component>
<Component>
<File Id="ProjectA.NlogDependancy"
Name="NLog.dll"
Source="$(var.ProjectA.TargetDir)Nlog.dll"
KeyPath="yes" />
</Component>
<Component>
<File Id="ProjectB.Output"
Name="$(var.ProjectB.TargetFileName)"
Source="$(var.ProjectB.TargetPath)"
KeyPath="yes" />
</Component>
<Component>
<File Id="ProjectB.AutofacDependancy"
Name="Autofac.dll"
Source="$(var.ProjectB.TargetDir)Autofac.dll"
KeyPath="yes" />
</Component>
这并不是很难做到的,除非你有几百个二进制文件,否则不会花费你太长时间。
当我尝试为我的解决方案创建.msi安装时,我遇到了类似的问题。
为了克服这个问题,并使它长时间持续,即使当我插入新的。dll和其他依赖到我的项目,并使其自动,我做了以下。
在我的产品中。我有这个目录
<!--Here We Install Our Main App-->
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="INSTALLFOLDER" Name="MyAppDir"/>
</Directory>
...
</Directory>
和在我的Wix项目-> properties -> Build events -> Pre - Build event命令行中,我添加了这个命令:
"%wix%binheat" dir "$(SolutionDir)MainProjectbinDebug" -dr INSTALLFOLDER -scom -frag -srd -sreg -gg -cg Components -var var.MainProject.TargetDir -o $(SolutionDir)MainProjectIncludedheat.wxs
一旦我构建了我的wix项目,它将创建一个Includedheat。我的MainProject目录下的wxs文件,列出了我的MainProjectbinDebug目录下的所有文件。
下一步-添加Includedheat。在wix项目中添加wxs,然后在特性部分添加:
<!--Add Component-->
<Feature Id="MainApplication" Title="Main Application" Level="1">
...
<ComponentGroupRef Id="Components" />
</Feature>
现在,一旦我重新构建并安装。msi,所有驻留在我的MainProjectbinDebug目录中的内容也将包含在目标位置的MyAppDir目录中。
查看更多信息:我遵循以下指南:
创建一个工作的Wix项目。
Easy way heat.exe.
还建议阅读以确定在命令中使用哪些标志