在MSbuild构建期间获取项目版本信息

时间:2013-01-11 02:57:24

标签: msbuild continuous-integration version

我正在尝试通过MSBuild自动构建我们的安装程序。我遇到的问题是获取调用自定义MSBuild脚本的C#项目的版本信息,然后在构建过程中将版本号传递给Wix。

我想要做的是将版本设置为以下属性:

<ProductVersion>$(MajorVersion).$(MinorVersion).$(PatchVersion).$(BuildVersion)</ProductVersion>
<InstallerName>"$(ProductName)-$(ProductVersion).msi"</InstallerName>

版本作为我们持续集成构建的一部分进行更新,并将版本号合并到构建在我们的持续集成服务器上的每个安装程序中,这有助于我们生成可连续部署的应用程序。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

我解决这个问题的方法是在我的代码库中创建一个'version.xml'文件。该文件包含以下数据

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="3.5"
         DefaultTargets="Build"
         xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <VersionMajor>0</VersionMajor>
        <VersionMinor>1</VersionMinor>
        <VersionBuild>1</VersionBuild>
        <VersionRevision>0</VersionRevision>
    </PropertyGroup>
</Project>

在我的情况下,此文件已签入,但使用构建服务器中的信息或任何需要的信息生成此文件应该不会太难。

在构建过程中,自定义MsBuild taks(类似于TemplateFile task)会从各自的模板文件中创建一个程序集信息文件和一个Wix包含文件。通过将其包含在MsBuild脚本中来访问“version.xml”文件。例如:

<?xml version="1.0" encoding="utf-8"?>
<Project 
    ToolsVersion="4.0" 
    DefaultTargets="Build" 
    xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

    <!-- Include the version info file so that we can pull the version info from it -->
    <Import 
        Project="$(DirWorkspace)\version.xml" 
        Condition="Exists('$(DirWorkspace)\version.xml')" />

    <!-- Generate a file with the version information -->
    <Target Name="GenerateAssemblyInfoVersionNumber">
    <ItemGroup>
      <VersionTokens Include="Major">
        <ReplacementValue>$(VersionMajor)</ReplacementValue>
      </VersionTokens>
      <VersionTokens Include="Minor">
        <ReplacementValue>$(VersionMinor)</ReplacementValue>
      </VersionTokens>
      <VersionTokens Include="Build">
        <ReplacementValue>$(VersionBuild)</ReplacementValue>
      </VersionTokens>
      <VersionTokens Include="Revision">
        <ReplacementValue>$(VersionRevision)</ReplacementValue>
      </VersionTokens>
    </ItemGroup>
    <TemplateFile 
        Template="$(FileTemplateAssemblyVersion)"
        OutputFileName="$(FileGeneratedAssemblyVersion)" 
        Tokens="@(VersionTokens)" />
  </Target>
</Project>

C#项目中包含的AssemblyInfo.VersionNumber.cs文件是从模板文件生成的,如下所示:

//-----------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//
//     Changes to this file may cause incorrect behavior and will be lost
//     if the code is regenerated.
// </auto-generated>
//-----------------------------------------------------------------------

using System.Reflection;

[assembly: AssemblyVersion("${Major}.${Minor}.${Build}.${Revision}")]
[assembly: AssemblyFileVersion("${Major}.${Minor}.${Build}.${Revision}")]

// The AssemblyInformationalVersion stores the version that will be displayed in
// Windows explorer.
[assembly: AssemblyInformationalVersion("${Major}.${Minor}.${Build}.${Revision}")]

在替换过程中,${TEXT_HERE}部分将替换为各自的值。

Wix包含模板文件如下所示:

<?xml version="1.0" encoding="utf-8"?>
<Include xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <!--
      This is a generated file.
      Do NOT make changes to this file.
      They will be undone next time the file is generated.
    -->

    <!-- The current version -->
    <?define CurrentVersion = "${Major}.${Minor}.${Build}"?>

    <!-- The install version string -->
    <?define ProductVersionFolder = "${Major}.${Minor}"?>
</Include>

包含此文件后,可以在Wix安装程序中引用CurrentVersionProductVersionFolder变量。

通过使用此方法,版本信息存储在一个位置,并且可以由构建的所有部分访问。