配置 WiX 自动设置产品版本属性?

2023-12-28

目前,每当我构建包时,我都必须手动增加 P​​roduct.wxs 文件中的 Version 属性,如下所示:

<Product 
    Id = "*"
    Version="4.1.3"

我想自动化它,以简化构建过程。我们对 exe/dll 文件使用以下版本控制方案:

major.minor.special.build

特殊值几乎从未使用过,并设置为 0,并且约定是按如下方式对打包的 MSI 进行版本控制,因为您只能使用三个数字:

major.minor.build

我见过的唯一解决方案可以让您获取其他项目的 4 位数字版本,然后截断构建版本,因此您最终会得到以下结果:

major.minor.special

显然这不适用于我们的方案,因为我们丢失了内部版本号。我怎样才能抓住major.minor.build,忽略特殊?


我使用每次构建时重新生成的包含文件中的 WiX 变量。

由于我的项目是 .wixproj (MSBuild/Visual Studio),因此我只是将版本提取和格式设置为自定义的内联 MSBuild 任务,并在 BeforeBuild 目标中调用它。

在下面的示例中,我获取了产品主组件的组件版本。您可以将其编码为您想要的任何版本。

使用 WiX Include 和变量

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <?include ProductVersion.wxi?>
  <Product Version="$(var.ProductVersion)" …>
…
</Wix>

示例 ProductVersion.wxi

<Include>
  <?define ProductVersion=1.0.38549?>
</Include> 

我建议在项目中包含 .wxi 文件,以便它在解决方案视图中可见。而且,由于它已生成,我建议将其从源代码管理中排除。

编辑WixProj

.wixproj 既是 Visual Studio 项目文件,也是 MSBuild 项目文件。要在 Visual Studio 中编辑 Visual Studio 项目文件,请选择教程或扩展 https://www.google.com/search?q=edit+visual+studio+project+file.

构建目标之前

MSBuild 系统(包括 WiX 的系统)提供 BeforeBuild 和 AfterBuild 目标,如 .wixproj 注释中所述。

只需将目标从注释中拉出并添加任务调用即可。

<Target Name="BeforeBuild">
  <GenerateProductVersion AssemblyPath='../wherever/whatever.exe' />
</Target>

MSBuild 内联任务

任务代码可以位于其自己的 MSBuild 文件甚至 DLL 中以供重用。或者,对于脚本方法,它可以是内联的。

此任务分为 3 个部分:

  • 文件路径参数(因为它会因项目而异)
  • 提取(带日志记录)
  • 包含生成(项目文件夹中的硬编码名称,因为它不需要改变)

.

<UsingTask TaskName="GenerateProductVersion" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
<ParameterGroup>
  <AssemblyPath ParameterType="System.String" Required="true" />
</ParameterGroup>
<Task>
  <Reference Include="System.Xml" />
  <Reference Include="System.Xml.Linq" />
  <Using Namespace="System" />
  <Using Namespace="System.Xml.Linq" />
  <Using Namespace="System.Reflection" />
  <Code Type="Fragment" Language="cs"><![CDATA[
    var assemblyVersion = AssemblyName.GetAssemblyName(AssemblyPath).Version;
    var productVersion = String.Format("{0}.{1}.{2}", assemblyVersion.Major, assemblyVersion.Minor, assemblyVersion.Revision);
    Log.LogMessage(MessageImportance.High, "ProductVersion=" + productVersion + " extracted from assembly version of " + AssemblyPath);
    new XDocument(
        new XElement("Include", 
            new XProcessingInstruction("define", "ProductVersion=" + productVersion)))
        .Save("ProductVersion.wxi");
  ]]></Code>
</Task>
</UsingTask>

使 EXE 路径更加可见

所有这些都在项目文件中隐藏得很好。许多项目设计者都有一个“构建”选项卡,允许在构建中输入名称-值对。这提供了一种从 XML 中向上提升路径的机制。

<Target Name="BeforeBuild">
  <GenerateProductVersion AssemblyPath='$([System.Text.RegularExpressions.Regex]::Match(";$(DefineConstants);", ";VersionExtractionPath=(?&lt;path&gt;.*?);").Groups["path"].Value)' />
</Target>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

配置 WiX 自动设置产品版本属性? 的相关文章

  • 如何使用 WiX 设置服务的恢复选项?

    我有以下 wxs 文件
  • 如何确定现有应用程序的安装范围?

    我有一个基于的安装程序WixUI Advanced允许用户选择安装范围 每个用户或机器范围 升级时 安装了较低版本的现有应用程序 我想隐藏安装范围屏幕并自动选择他们上次选择的安装范围 如何判断先前安装使用的安装范围 Edit 查看我的 MS
  • 获取生成的 ProductCode 作为 Wix 中的变量

    在我们的产品中我们使用Product Id 在 Wix 中告诉它为每个新版本生成新的产品代码 现在 我们需要在安装期间将正在安装的 MSI 的产品代码记录到我们的注册表项之一中 我们可以通过循环遍历 卸载 注册表项中的条目来查找产品名称和版
  • 当自动为 WIX 安装程序收集文件时,我的目录结构有多灵活?

    请原谅我的无知 我一直在阅读一些书 但还没有准备好尝试任何东西 目前 我们有一个 wxs 文件 该文件无法轻松维护 每当从 SVN 提交 删除新文件时 都会手动添加 删除所有文件 由于在创建新文件和更新 wxs 安装文件之间发生了失误 我们
  • ICE61:该产品应仅删除其自身的旧版本

    我正在关注第二个答案here https stackoverflow com questions 500703 how to get wix to update a previously installed version of a pro
  • 与 WiX 3.0 一起安装 WiX 3.5

    是否可以同时安装 WiX 3 0 和 3 5 如果我在安装 3 0 后安装 3 5 它会删除 3 0 文件 如果我尝试在 3 5 之后安装 3 0 它会告诉我已经安装了较新的版本 我正在从 VS 2008 迁移到 VS 2010 因此我的应
  • 使用 WiX 将程序集放入 GAC 和安装路径中

    我刚刚开始学习如何使用 WiX 但遇到了障碍 我的软件包使用第三方库 该库要求 GAC 和软件包安装目录中都存在一些文件 使用 WiX 我可以使文件显示在安装目录或 GAC 中 但不能同时显示在两者中 有什么办法可以解决这个问题吗 这里有一
  • 如何创建 heat.exe 收集的文件的快捷方式?

    使用 WiX Toolset 3 10 并尝试创建已使用 WiX Toolset 收获的某些文件的快捷方式heat exe效用 如 WIX bin heat exe dir SourceDir nologo platform x64 ke
  • 从对话框调用 CustomAction 时出现 WiX 安装错误 2762

    我是初学者 开始学习WiX 我想在安装过程中捕获 验证和注册用户详细信息 我创建了一个对话框来捕获用户注册并在用户单击 下一步 后调用自定义操作 但在这里我收到安装程序错误 2762 虽然错误描述说 必须在 InstallInitializ
  • WIX MSI 软件包卸载

    我正在使用 WIX 作为安装程序包 当我通过双击原始 msi 包卸载该包时 一切都很好 当我从控制面板卸载时 它会给我一个最小的用户界面卸载 我已在 MSI 中写入一个自定义操作 询问用户是否要卸载某些数据库等 最小 UI 卸载时不会发生这
  • WiX - 根据环境将编译后的 web.config 复制到网站根目录

    作为 WiX 安装的一部分 我将所有转换 编译的 web config 文件复制到安装目录 编译后的 web config 的名称格式为 web ENV config 在我的安装 UI 中 我创建了一个自定义对话框 在其中解析 ENV 并填
  • 自定义 WiX Burn 引导程序用户界面?

    我主要使用 WiX 3 6 创建一个安装包 这样我就可以利用Burn http en wikipedia org wiki WiX Burn引导功能 到目前为止 我已经将多个 MSI 软件包捆绑在一起 这些软件包将与内置引导程序应用程序一起
  • WiX - 通过检查修订来防止降级

    我正在寻找一种方法来防止我的应用程序降级 但 问题 是 我必须检查修订号 例如 安装 1 0 0 1 时应该可以安装 1 0 0 2 但安装 1 0 0 2 时不应该安装 1 0 0 1 我知道 Element MajorUpgrade 仅
  • Wix - 自定义安装目录

    我使用的是 Wix 3 x 用户应该能够选择目标目录 我的Setup wxs目前是这样的 http pastebin com uH1EjbDQ http pastebin com uH1EjbDQ 询问用户自定义目标目录的最简单方法是什么
  • 验证服务是否被标记为删除

    有时 当我卸载安装程序 使用 WIX 创建的 时 服务仍标记为删除 用户必须重新启动计算机才能再次安装 我如何验证该服务是否已标记为删除并告诉用户在进行其他安装之前重新启动计算机 一般来说 当某项服务仍然锁定在该服务上 从而阻止 Windo
  • 维克斯。相同版本不同产品代码如何进行重大升级?

    基本上我需要改变这种行为 安装具有相同版本和升级代码的产品 但 不同的产品代码 是允许的 并被 MSI 视为两种产品 我需要将其作为重大升级进行威胁 因此 在 v 1 0 1 旧版本 不同的 ProductCode 上安装 v 1 0 1
  • WiX:数字签名 BootStrapper 项目

    我有一个项目 我为其构建了 WiX msi 文件 我还有一个 WiX 引导程序 exe 文件 用于检查 C 2005 是否存在 如果未找到则安装它 然后安装 msi 软件包 我的项目包括作为 msm 文件的 Crystal Reports
  • 让 WiX Bootstrapper 用于 .NET 4.0 的引导

    我一直在寻找让我的引导程序能够安装 NET 4 0 和我自己的应用程序 我查看了几个博客和教程 但无法让它发挥作用 我在 Stack Overflow 问题中读到在 WiX 中启动 调用引导程序 https stackoverflow co
  • 在 WiX 中轻量运行时,DefaultDir 无效

    我只是想做一个安装程序 将一些文件移动到程序文件中 设置开始菜单链接 并出现在要卸载的添加 删除程序中 目前我很乐意点击开始菜单链接 因为这看起来相对简单 需要注意的是 我特别希望可以通过脚本构建它without任何类型的全局安装 这意味着
  • 如何在 WiX 中启动 PowerShell 并正确访问 Windows 注册表?

    Update 有趣的是 如果我运行 32 位 powershell 来运行脚本 它会给我同样的错误 看起来32位powershell无法访问64位注册表树 我尝试使用WixQuietExec64但它给出了同样的错误 我还尝试提供 power

随机推荐