使用 WiX 包含文件,您可以将简单值与大部分 WiX 标记分开。使用 WiX 预处理,您可以定义用于属性或文本节点或条件编译的命名替换值,然后将它们称为 $(var.name)。
-- 版本.wxi--
<?xml version="1.0" encoding="utf-8"?>
<Include>
<?define Version="1.2.3" ?>
</Include>
-- Bundle.wxs --
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<?include "Version.wxi" ?>
<Bundle
Version="$(var.Version)"
…
有时在源项目中生成包含文件以供下游使用或将它们作为 WiX 项目的第一步生成是很方便的。
我看到您正在将 Visual Studio 用于您的 WiX Bootstrapper 项目。 Visual Studio 项目是一个专门的 MSBuild 项目(与大多数类型的 Visual Studio 项目一样)。这意味着您可以将一般的 MSBuild 内容放入项目文件中。您可以在 XML 编辑器(例如 Visual Studio)中将 .wixproj 文件作为 XML 文件打开。
MSBuild 允许您使用 .NET 语言从外部 DLL 或内联定义新任务。在这种情况下,几行 C# 就可以很好地定义任务。然后,您将在主要构建任务之前调用它。与许多使用 MSBuild 的构建系统一样,WiX 确保目标 BeforeBuild 在开始工作之前执行。因此,您只需要定义 BeforeBuild。
任务名为 CreateVersionWxi。
<UsingTask
TaskName="CreateVersionWxi"
TaskFactory="CodeTaskFactory"
AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v12.0.dll">
<ParameterGroup />
<Task>
<Reference Include="System.Xml" />
<Reference Include="System.Xml.Linq" />
<Using Namespace="System.Xml.Linq" />
<Code Type="Fragment" Language="cs"><![CDATA[
var version = File.ReadAllText("version.txt");
var wxi =
new XDocument(
new XComment("*** GENERATED FILE. DO NOT EDIT ***"),
new XElement("Include",
new XProcessingInstruction("define", "Version='" + version + "'")));
wxi.Save("version.wxi");
]]></Code>
</Task>
</UsingTask>
<Target Name="BeforeBuild">
<CreateVersionWxi />
</Target>
最后,如果您将 version.txt 及其构建操作添加到项目中,例如作为内容,则每当 version.txt 更改时,项目将被视为需要重新构建。如果您在外部更改 version.txt 时在 Visual Studio 中打开了 WiX 项目,这将有所帮助。
您无需将 Version.wxi 添加到您的项目中,但这样做会增加其对未来维护者的可见性。
提示:一些 Visual Studio 用户更熟悉项目页面上的构建事件。要提示它们,您可以将其作为预构建事件命令行输入:REM See the BeforeBuild target in the .wixproj file