使用 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
中得到了解决
我正在探索 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
中得到了解决