使用 Wix 构建 MSI 的递归 DirFiles#

Recursive DirFiles to build MSI using Wix#

我正在探索 Wix# 的功能,我对它与 Wix 相比的简单性感到震惊。我们已经在使用 QT Installer Framework,但我们的客户也需要 MSI 安装包。

我已经有了一个包含我们产品所有文件的目录,而且只有一个包。我试图将 C:\Temp\MyProductFiles 中的所有文件包含到我的 MSI 安装程序中。

using System;
using WixSharp;

class Script
{
    static public void Main(string[] args)
    {
        Compiler.WixLocation= @"C:\WiX-3.7\binaries"; 
        var project = new Project("MyProduct",
                          new Dir(@"C:\Temp\MyProduct", 
                            new DirFiles(@"C:\Temp\MyProductFiles\*.*")
                           )
                      );
        project.UI = WUI.WixUI_Common;

        Compiler.BuildMsi(project);
    }
}

安装程序基本上按预期工作,但不幸的是 C:\Temp\MyProductFiles 包含许多子目录,我不想每次都明确说明,因为我们有多个产品。

有没有使用 Wix# 自动包含所有文件和子目录的简便方法?

也许用C#也能做到,但我对C#不精通,实在不知道如何下手。

据我所知,没有内置机制获取所有子目录,但您可以递归遍历树,并将每个条目投影到 DirFiles

IEnumerable<string> GetSubdirectories(string root)
{
    string[] subdirectories = Directory.GetDirectories(root);
    foreach (var subdirectory in subdirectories)
    {
        yield return subdirectory;
        foreach (var nestedDirectory in GetSubdirectories(subdirectory))
        {
            yield return nestedDirectory;
        }
    }
}

投影可以输出到具有强制通配符模式的 DirFiles 数组中:

DirFiles[] dirFiles = GetSubdirectories(rootPath).Select(d => new DirFiles(Path.Combine(d, "*.*"))).ToArray();

那么,通过就可以了:

var project = new Project("MyProduct", new Dir(@"C:\Temp\MyProduct", dirFiles)));

要包含所有文件和子目录,请使用 new Files("@"C:\Temp\MyProductFiles\*.*") 而不是 new DirFiles(@"C:\Temp\MyProductFiles\*.*"

var project =
    new Project("MyProduct",
        new Dir(@"%ProgramFiles%\My Company\My Product",
            new Files(@"..\Release Folder\Release\*.*")

"Release Folder" WixSharp Sample

这个问题也在 Issue #439 - List directories with wilcards and nested DirFiles

中得到了解决