我正在使用WiX工具集构建安装程序,我想从文本文件中读取版本。文本文件位于mybootstrapper中,如下所示:
下面是我要读取文本文件内容的代码
<Bundle IconSourceFile='product.ico'
Name="Retail Grip"
Version="Version.txt" <!-- i know this is not correct -->
Manufacturer="Company Name"
UpgradeCode="PUT-GUID-HERE">
答案 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