如何在Wix Toolset Bootstrapper中读取文本文件的内容

时间:2018-06-24 05:32:04

标签: installation wix windows-installer

我正在使用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 :(得分:2)

哦,它是WiX捆绑软件-是“ Wax ”吗?我听说这是一种WiX工具吗?我不确定它是如何工作的(该链接的页面截图)。也许在使用编译器变量时有限制?

在看到该 Wax文件之前,我写了以下内容,我认为您使用的是普通的WiX源而不是捆绑包。无论哪种方式,让我添加我写的内容,看看是否有帮助。相似之处。

也:Neil Sleightholm's WiX Burn Template(朝上)。请先旋转该链接。


在常规的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>

Larger sample here(这种方法很简单)。

然后将文件包含在您的主要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), Create universal variables-链接时间变量分辨率(light.exe),与预处理器变量的编译时间分辨率< / strong>(candle.exe)。 Some context


一些相关链接:

答案 1 :(得分:1)

使用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内容放入项目文件中。您可以在XML编辑器(例如Visual Studio)中以XML文件的形式打开.wixproj文件。

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添加到您的项目中,比如说作为Content,则每当version.txt更改时,都将需要重建该项目。如果在外部更改version.txt时在Visual Studio中打开WiX项目,这将有所帮助。

您无需将Version.wxi添加到您的项目中,但这样做可以增加其对未来维护者的可见性。

提示:一些Visual Studio用户对项目页面上的Build Events更为熟悉。要提示它们,可以输入以下内容作为预构建事件命令行:REM See the BeforeBuild target in the .wixproj file