我的项目中有一个包含许多文件的Bin文件夹。目前,我只知道如何使用以下代码添加特定文件来安装文件夹。
<File Source='$(var.Debug)Myapplication.exe' Id='file4028276A0CAD84E3BDE449237AE31A5F' />
但是,我想将整个目录移动到安装路径。例如,将整个文件夹“Bin”移动到安装路径“C:\ Myapplication”。
那我该怎么办?
提前致谢!
答案 0 :(得分:59)
听起来你想要使用的是WiX工具heat
,它用于&#34;收获&#34;一个目录(或单个文件)并创建一个可在项目中使用的WiX片段文件。
例如,你有一个你想要收获的目录,它可能包含子目录,但是有很多文件,你想要它们......热量会为你做。
考虑这个微不足道的结构:
Somedir
|
|---A file.txt
|---An init file.ini
|---another file.txt
|---subfolder
|
|---a subfolder file.txt
如果使用heat来获取此目录,该工具将为您生成片段文件,您可以将其用作项目中的组件参考,而无需一次指定一个文件或使用变通方法解决方案。
例如,以下加热命令将处理此目录(在此示例中为一级)
heat dir somedir -o MyHarvestedStuff.wxs -scom -frag -srd -sreg -gg -cg MyComponentGroupId -dr BIN_DIR_REF
其中:
dir = harvest a directory
somedir = directory you want to harvest
-o MyHarvestedStuff.wxs = the output fragment file
-scom -sfrag -srd -sreg = Suppress COM elements, fragments, root directory as element, registry harvesting (these options will create a grouping that most applications can use)
-gg = generate GUID's now (this will put the GUID's into your output file, rather than using a wildcard "*". The advantage here is you can use non-standard TARGETDIR, which would not qualify for autogenerated GUID's)
-cg MyComponentGroupId = component group. this is what you will use in your feature set to include these files
-dr BIN_DIR_REF = this is the directory reference for which to place the files in your final package.
生成的XML看起来像这样(这是在没有-gg的情况下运行以避免发布真正的GUID)
<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
<DirectoryRef Id="BIN_DIR_REF">
<Directory Id="dirF065D7446868E03DB0B296EBADA4E4A1" Name="subfolder" />
</DirectoryRef>
</Fragment>
<Fragment>
<ComponentGroup Id="MyComponentGroupId">
<Component Id="cmp739547000B47E975B0452D876AF7810B" Directory="BIN_DIR_REF" Guid="PUT-GUID-HERE">
<File Id="fil09B311A6D1EABD9E94DFA5C83F59C548" KeyPath="yes" Source="SourceDir\A file.txt" />
</Component>
<Component Id="cmp84C8400F892D39B05EE3021CCEEAA14F" Directory="BIN_DIR_REF" Guid="PUT-GUID-HERE">
<File Id="fil11A22646343997D26AC54171A62DFF4C" KeyPath="yes" Source="SourceDir\an init file.ini" />
</Component>
<Component Id="cmpFA266FC6F3269CB5D9E42C38FC995117" Directory="BIN_DIR_REF" Guid="PUT-GUID-HERE">
<File Id="filA545B6E4B63B8211E982917FC78F6EB4" KeyPath="yes" Source="SourceDir\another file.txt" />
</Component>
<Component Id="cmp2EC5C1618A59F47B7BDE800EB9AA8688" Directory="dirF065D7446868E03DB0B296EBADA4E4A1" Guid="PUT-GUID-HERE">
<File Id="filB0CD0B02385137DC806112E293083459" KeyPath="yes" Source="SourceDir\subfolder\a subfolder file.txt" />
</Component>
</ComponentGroup>
</Fragment>
</Wix>
在您的项目文件中,您在根<Directory>
元素下会出现类似内容:
<Directory Id="BIN_DIR_REF" Name="bin">
<!-- anything else you might put here...-->
</Directory>
在您的功能组中:
<Feature Id="Complete" Level="1">
...
<ComponentGroupRef Id="MyComponentGroupId" />
...
</Feature>
将它们捆绑在一起......
candle
candle
生成的.wixobj文件提供给light
使用WiX预处理器变量或使用SourceDir
选项解析新片段文件中的-b
引用light
例如:light ... -b "path to my directory that I harvested" ...
不要让答案的长度阻止你探索这个解决方案,它运作得很好而且非常简单。现在,如果您想从该目录中排除任何内容,那就是整个其他故事...
答案 1 :(得分:3)
how to include a large directory tree in a wix installer
这看起来不错。但是要做太多工作。
以上链接运行正常。但无法复制子文件夹。
所以我做的是,我创建了一个应用程序,它读取整个文件夹并获取其子目录和文件,并生成必要的代码块,如
<Component Id="myfile" Guid="GUID">
<File Id="myfile.txt" Source="MySourceFiles\myfile.txt" KeyPath="yes" Checksum="yes"/>
</Component>
然后我将生成的代码块添加到.wxs文件中。
您花在创建此应用上的初始时间并非浪费。因为你可以永远使用它。 我建议您逐个文件复制,因为它在升级或修复过程中很有用。 MSI为每个要复制的文件保留记录。因此它在升级和维修方面是可维护和有用的。