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

Ete*_*l21 0 wix

当前,每当我构建软件包时,都必须像这样在Product.wxs文件中手动增加Version属性:

<Product 
    Id = "*"
    Version="4.1.3"
Run Code Online (Sandbox Code Playgroud)

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

major.minor.special.build
Run Code Online (Sandbox Code Playgroud)

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

major.minor.build
Run Code Online (Sandbox Code Playgroud)

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

major.minor.special
Run Code Online (Sandbox Code Playgroud)

显然,这对我们的方案不起作用,因为我们丢失了内部版本号。我该如何抓住major.minor.build而忽略特殊性?

Tom*_*get 5

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

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

在下面的示例中,我获得了产品主装配体的装配体版本。您可以将其编码为所需的任何版本。

使用WiX包含和变量

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

示例ProductVersion.wxi

<Include>
  <?define ProductVersion=1.0.38549?>
</Include> 
Run Code Online (Sandbox Code Playgroud)

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

编辑WixProj

.wixproj既是Visual Studio项目文件,又是MSBuild项目文件。要在Visual Studio中编辑Visual Studio项目文件,请选择一个教程或扩展名

施工前目标

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

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

<Target Name="BeforeBuild">
  <GenerateProductVersion AssemblyPath='../wherever/whatever.exe' />
</Target>
Run Code Online (Sandbox Code Playgroud)

MSBuild内联任务

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

此任务分为三部分:

  • 文件路径参数(因为它随项目而异)
  • 提取(带记录)
  • 包括生成(在项目文件夹中为硬编码名称,因为它不需要更改)

<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>
Run Code Online (Sandbox Code Playgroud)

使EXE路径更可见

所有这些在项目文件中都隐藏得太好了。许多项目设计人员都有一个“构建”选项卡,该选项卡允许在构建中输入名称/值对。这提供了一种提高XML路径的机制。

<Target Name="BeforeBuild">
  <GenerateProductVersion AssemblyPath='$([System.Text.RegularExpressions.Regex]::Match(";$(DefineConstants);", ";VersionExtractionPath=(?&lt;path&gt;.*?);").Groups["path"].Value)' />
</Target>
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

  • 这也是我认为可能的解决方案。请在您的答案中提供一个最小可行的示例。 (2认同)