С помощью включаемых файлов WiX вы можете хранить простые значения отдельно от основной части разметки WiX.С предварительной обработкой WiX вы можете определить именованные значения подстановки, используемые в атрибутах, текстовых узлах или условной компиляции, а затем обращаться к ним как $(var.name)
.
- Version.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 в файл проекта.Вы можете открыть файл .wixproj в виде файла XML в редакторе XML (например, Visual Studio).
MSBuild позволяет определять новые задачи из внешней библиотеки DLL или встроенного файла с использованием языка .NET.В этом случае несколько строк 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 в свой проект с его действием сборки, скажем, как Content, проект будет сочтен нужнымбыть перестроен всякий раз, когда version.txt изменяется.Это поможет, если у вас есть проект WiX, открытый в Visual Studio при внешнем изменении version.txt.
Вам не нужно добавлять Version.wxi в ваш проект, но это увеличивает его видимость для будущих сопровождающих.
Совет. Некоторые пользователи Visual Studio более знакомы с событиями сборки встраницы проекта.Чтобы понять их, вы можете ввести это как командную строку события перед сборкой: REM See the BeforeBuild target in the .wixproj file