我的项目中有一个包含许多文件的Bin文件夹.目前,我只知道如何使用下面的代码添加特定文件来安装文件夹.
<File Source='$(var.Debug)Myapplication.exe' Id='file4028276A0CAD84E3BDE449237AE31A5F' />
Run Code Online (Sandbox Code Playgroud)
但是,我想将整个目录移动到安装路径.例如,将整个文件夹"Bin"移动到安装路径"C:\ Myapplication".
那我该怎么办?
提前致谢!
Rya*_*n J 68
听起来像你想要使用的是WiX工具heat,它用于"收获"一个目录(或单个文件)并创建一个可以在项目中使用的WiX片段文件.
例如,你有一个你想要收获的目录,它可能包含子目录,但是有很多文件,你想要它们......热量会为你做到这一点.
考虑一下这个简单的结构:
Somedir
|
|---A file.txt
|---An init file.ini
|---another file.txt
|---subfolder
|
|---a subfolder file.txt
Run Code Online (Sandbox Code Playgroud)
如果使用heat来获取此目录,该工具将为您生成片段文件,您可以将其用作项目中的组件参考,而无需一次指定一个文件或使用变通方法解决方案.
例如,以下heat命令将处理此目录(在此示例中从一个级别开始)
heat dir somedir -o MyHarvestedStuff.wxs -scom -frag -srd -sreg -gg -cg MyComponentGroupId -dr BIN_DIR_REF
Run Code Online (Sandbox Code Playgroud)
哪里:
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.
Run Code Online (Sandbox Code Playgroud)
生成的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>
Run Code Online (Sandbox Code Playgroud)
在你的项目文件中,你的根<Directory>元素下面会有这样的东西:
<Directory Id="BIN_DIR_REF" Name="bin">
<!-- anything else you might put here...-->
</Directory>
Run Code Online (Sandbox Code Playgroud)
在您的功能组中:
<Feature Id="Complete" Level="1">
...
<ComponentGroupRef Id="MyComponentGroupId" />
...
</Feature>
Run Code Online (Sandbox Code Playgroud)
将它们捆绑在一起......
candle以及其他文件candle生成的.wixobj文件lightSourceDir使用WiX预处理器变量或-b选项to 解析新片段文件中的引用light
例如: light ... -b "path to my directory that I harvested" ...
不要让答案的长度阻止你探索这个解决方案,它运作得很好,而且非常简单.现在,如果你想从该目录中排除任何东西,这是一个整体的其他故事...
这看起来不错。但要做的工作太多了。
上面的链接效果很好。但无法复制子文件夹。
所以我所做的是,我创建了一个应用程序,它读取整个文件夹并获取其子目录和文件,并生成必要的代码块,例如
<Component Id="myfile" Guid="GUID">
<File Id="myfile.txt" Source="MySourceFiles\myfile.txt" KeyPath="yes" Checksum="yes"/>
</Component>
Run Code Online (Sandbox Code Playgroud)
然后我将生成的代码块添加到 .wxs 文件中。
您最初花费在创建此应用程序上的时间并没有浪费。因为你可以永远继续使用它。我建议您逐个复制文件,因为这在升级或修复过程中很有帮助。MSI 为每个要复制的文件保留记录。因此它是可维护的,并且在升级和维修时很有用。
| 归档时间: |
|
| 查看次数: |
22953 次 |
| 最近记录: |