【问题标题】:How to read content of text file in Wix Toolset Bootstrapper如何在 Wix Toolset Bootstrapper 中读取文本文件的内容
【发布时间】:2018-06-24 05:32:03
【问题描述】:

我正在使用 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">

【问题讨论】:

  • 这个version.txt是从哪里来的?是否有必要独立于为捆绑包提供版本的目标?
  • 我想知道Wax tool是否与它有关?我以前从未使用过。
  • 我已经构建了单独的项目来进行所有升级和更新。例如更新服务器上的文本文件以通知更新,创建 exe 和其他文件的 zip 文件然后上传到服务器等,从文本文件读取版本的原因也是为了从那个单独的项目中控制它。抱歉解释不好。
  • @Stein 实际上我正在使用 Wax Tool,它是一个非常有用的插件。通过使用蜡工具,我不必使用 candle.exe 或 light.exe 或其他东西

标签: installation wix windows-installer


【解决方案1】:

哦,这是一个 WiX 捆绑包 - 那是“Wax”?我听说它是​​某种 WiX 工具?我不确定它是如何工作的(该链接中的页面截图)。可能在使用的时候对编译器变量的使用有限制?

我在看到 Wax 文件 之前写了以下内容,并且我认为您有一个普通的 WiX 源而不是 bundle 源。无论哪种方式,让我添加我写的内容,看看它是否有帮助。相似之处。

另外: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),与预处理器变量的编译时解析相反( candle.exe)。 Some context.


一些相关链接:

【讨论】:

  • 感谢您的友好回答,我正在检查它,一旦完成就会让您。投票回答。如果可行,我会接受它作为答案。再次感谢
【解决方案2】:

使用 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

【讨论】:

    猜你喜欢
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 2014-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多