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

Jac*_* He 17 c# wix winforms

我的项目中有一个包含许多文件的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)

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

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

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

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

  • 这超出了很多信息,IMO应该被标记为正确的答案. (6认同)

Leo*_*eoN 2

如何在 wix 安装程序中包含大型目录树

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

wix中如何复制文件夹

上面的链接效果很好。但无法复制子文件夹。

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

 <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 为每个要复制的文件保留记录。因此它是可维护的,并且在升级和维修时很有用。

  • 愿意分享该应用程序吗?^^ (6认同)