Как читать содержимое текстового файла в Wix Toolset Bootstrapper - PullRequest
0 голосов
/ 24 июня 2018

Я использую набор инструментов WiX для сборки установщика, я хочу прочитать версию из текстового файла. Текстовый файл находится в mybootstrapper, как показано ниже:

Wix toolset Bootstrapper direcotry tree

ниже код, где я хочу прочитать содержимое текстового файла

<Bundle IconSourceFile='product.ico'
Name="Retail Grip"
Version="Version.txt" <!-- i know this is not correct -->
Manufacturer="Company Name"
UpgradeCode="PUT-GUID-HERE">

Ответы [ 2 ]

0 голосов
/ 30 июня 2018

С помощью включаемых файлов 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

0 голосов
/ 24 июня 2018

О, это комплект WiX - и это " Воск "?Я слышал, что это своего рода инструмент WiX?Я не уверен, как именно это работает (скриншот страницы вниз по этой ссылке).Может быть, есть ограничения на использование переменных компилятора при его использовании?

Я написал ниже, прежде чем увидел Wax файл , и я подумал, что у вас нормальный источник WiX, а не связка источник.В любом случае, позвольте мне добавить то, что я написал, и посмотреть, поможет ли это.Сходства.

Также: Шаблон записи WiX от Нила Слайтхолма (вверху).Сначала дайте этой ссылке, пожалуйста.


В обычном файле WiX вы можете использовать переменную препроцессора : $(var.CurrentVersion) (переменная компилятора).Примерно так:

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">

  <?define UpgradeCode="PUT-GUID-HERE"?>
  <?define CurrentVersion="1.0.0.0"?>

  <Product Id="*" Name="Sample" Language="1033" Version="$(var.CurrentVersion)"
           Manufacturer="Someone" UpgradeCode="$(var.UpgradeCode)">

  <...>

Вы можете поместить переменные в собственный «включаемый файл»: Variables.wxi.

<Include>
   <?define UpgradeCode="PUT-GUID-HERE"?>
   <?define CurrentVersion="1.0.0.0"?>
</Include>

Увеличенный образец здесь для этого подхода (сделайте быстрый просмотр этого).

А затем включите файл в ваш основной источник WiX:

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">

  <?include Variables.wxi ?>

  <Product Id="*" Name="Sample" Language="1033" Version="$(var.CurrentVersion)"
           Manufacturer="Someone" UpgradeCode="$(var.UpgradeCode)">

  <...>

Также есть переменные локализации : WiX (Windows Installer Xml), Создать универсальные переменные - разрешение переменной времени соединения (light.exe), в отличие отразрешение времени компиляции переменных препроцессора (candle.exe). Некоторый контекст .


Некоторые релевантные ссылки:

...