Wix-如何复制目录以安装文件夹

时间:2014-10-24 15:06:43

标签: c# winforms wix

我的项目中有一个包含许多文件的Bin文件夹。目前,我只知道如何使用以下代码添加特定文件来安装文件夹。

<File Source='$(var.Debug)Myapplication.exe' Id='file4028276A0CAD84E3BDE449237AE31A5F' />  

但是,我想将整个目录移动到安装路径。例如,将整个文件夹“Bin”移动到安装路径“C:\ Myapplication”。

那我该怎么办?

提前致谢!

2 个答案:

答案 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>

将它们捆绑在一起......

  1. 将您的新片段文件与其他文件一起提供给candle
  2. candle生成的.wixobj文件提供给light
  3. 使用WiX预处理器变量或使用SourceDir选项解析新片段文件中的-b引用light

    例如:light ... -b "path to my directory that I harvested" ...

  4. 不要让答案的长度阻止你探索这个解决方案,它运作得很好而且非常简单。现在,如果您想从该目录中排除任何内容,那就是整个其他故事...

答案 1 :(得分:3)

how to include a large directory tree in a wix installer

这看起来不错。但是要做太多工作。

How do copy a folder in wix

以上链接运行正常。但无法复制子文件夹。

所以我做的是,我创建了一个应用程序,它读取整个文件夹并获取其子目录和文件,并生成必要的代码块,如

 <Component Id="myfile" Guid="GUID">
     <File Id="myfile.txt" Source="MySourceFiles\myfile.txt" KeyPath="yes" Checksum="yes"/>
 </Component>

然后我将生成的代码块添加到.wxs文件中。

您花在创建此应用上的初始时间并非浪费。因为你可以永远使用它。 我建议您逐个文件复制,因为它在升级或修复过程中很有用。 MSI为每个要复制的文件保留记录。因此它在升级和维修方面是可维护和有用的。