如何通过CI平台(Hudson)自动增加C#程序集版本?

All*_*ice 110 .net versioning msbuild continuous-integration hudson

我自己和我的团队在增加程序集版本号时非常可怕,我们经常发送1.0.0.0版本的程序集.显然,这会引起很多麻烦.

我们通过CI平台实现了更好的实践,我真的想将其设置为自动增加assemblyinfo.cs文件中的值,以便使用该程序集中的代码更改自动更新程序集的版本.

我之前已经设置(在我们找到Hudson之前)通过任一msbuild或者命令行(不记得)增加值的方法,但是使用Hudson,这将更新SVN存储库并触发另一个构建.由于Hudson每小时轮询SVN,这将导致缓慢的无限循环.

让Hudson增加版本号是一个坏主意吗?什么是另一种方法呢?

理想情况下,我的解决方案标准是:

  • 在构建assemblyinfo.cs之前增加内部版本号
  • 仅增加已更改的程序集中的内部版本号.这可能是不可能的,因为Hudson每次执行构建时都会清除项目文件夹
  • 将更改的assemblyinfo.cs提交到代码存储库(当前为VisualSVN)
  • 在下次扫描更改时,不会导致Hudson触发新构建

在我脑海中解决这个问题,我可以通过批处理文件/命令轻松地提出大部分解决方案,但是我的所有想法都会导致Hudson在下次扫描时触发新的构建.我不是在找人为我做任何事情,只是指出我正确的方向,也许是让Hudson忽略某些SVN提交的技巧等.

到目前为止我发现的所有内容都只是一篇文章,解释了如何自动增加版本号,没有考虑到可以旋转到无限循环的CI平台.

nos*_*nos 64

这是我所做的,用于标记AssemblyFileVersion属性.

从AssemblyInfo.cs中删除了AssemblyFileVersion

将名为AssemblyFileInfo.cs的新的空文件添加到项目中.

在hudson构建计算机上安装MSBuild社区任务工具集,或在项目中安装NuGet依赖项.

编辑项目(csproj)文件,它只是一个msbuild文件,并添加以下内容.

在某个地方会有一个<PropertyGroup>说明版本.改变它所以它读取,例如

 <Major>1</Major>
 <Minor>0</Minor>
 <!--Hudson sets BUILD_NUMBER and SVN_REVISION -->
 <Build>$(BUILD_NUMBER)</Build>
 <Revision>$(SVN_REVISION)</Revision>
Run Code Online (Sandbox Code Playgroud)

当项目在hudson上构建时(假设它是从subversion中获取的),Hudson提供了那些你在那里看到的env变量.

在项目文件的底部,添加

 <Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets" Condition="Exists('$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets')" />
  <Target Name="BeforeBuild" Condition="Exists('$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets')">
    <Message Text="Version: $(Major).$(Minor).$(Build).$(Revision)" />
    <AssemblyInfo CodeLanguage="CS" OutputFile="AssemblyFileInfo.cs" AssemblyFileVersion="$(Major).$(Minor).$(Build).$(Revision)" AssemblyConfiguration="$(Configuration)" Condition="$(Revision) != '' " />
  </Target>
Run Code Online (Sandbox Code Playgroud)

这使用MSBuildCommunityTasks生成AssemblyFileVersion.cs,以在构建项目之前包含AssemblyFileVersion属性.如果需要,您可以对任何/所有版本属性执行此操作.

结果是,无论何时发出hudson构建,生成的程序集都会得到一个1.0.HUDSON_BUILD_NR.SVN_REVISION的AssemblyFileVersion,例如1.0.6.2632,这意味着hudson中的第6个构建#,来自subversion版本2632的buit.


Gre*_*g D 62

一个简单的替代方法是让C#环境通过将version属性设置为major.minor.*(如AssemblyInfo文件模板中所述)来为您增加程序集版本.

不过,您可能正在寻找更全面的解决方案.

编辑(回复评论中的问题):

来自AssemblyInfo.cs:

// Version information for an assembly consists of the following four values:
//
//      Major Version
//      Minor Version 
//      Build Number
//      Revision
//
// You can specify all the values or you can default the Build and Revision Numbers 
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
Run Code Online (Sandbox Code Playgroud)


son*_*erd 42

这是一个优雅的解决方案,在添加新项目时需要先做一些工作,但很容易处理这个过程.

我们的想法是每个项目都链接到一个只包含程序集版本信息的解决方案文件.因此,您的构建过程只需更新单个文件,并在编译时从一个文件中提取所有程序集版本.

脚步:

  1. 将类添加到解决方案文件*.cs文件中,我命名为min SharedAssemblyProperties.cs
  2. 从该新文件中删除所有cs信息
  3. 从AssemblyInfo文件中剪切程序集信息:[assembly:AssemblyVersion("1.0.0.0")] [assembly:AssemblyFileVersion("1.0.0.0")]
  4. 添加语句"using System.Reflection;" 到文件然后将数据粘贴到新的cs文件中(来自SharedAssemblyProperties.cs)
  5. 将现有项添加到项目中(等待...在添加文件之前继续阅读)
  6. 选择文件,然后在单击"添加"之前,单击"添加"按钮旁边的下拉列表,然后选择"添加为链接".
  7. 对解决方案中的所有现有项目和新项目重复步骤5和6

将文件添加为链接时,它会将数据存储在项目文件中,并在编译时从此文件中提取程序集版本信息.

在源代码管理中,添加一个bat文件或脚本文件,只是递增SharedAssemblyProperties.cs文件,所有项目都将从该文件更新其程序集信息.


Mat*_*ord 11

可以将Hudson配置为忽略对某些路径和文件的更改,以便它不会提示新的构建.

在作业配置页面的" 源代码管理"下,单击" 高级"按钮.在" 排除区域"框中,输入一个或多个正则表达式以匹配排除项.

例如,要忽略对version.properties文件的更改,您可以使用:

/MyProject/trunk/version.properties
Run Code Online (Sandbox Code Playgroud)

这适用于C#以外的语言,并允许您将版本信息存储在subversion中.


Kyl*_*man 9

.NET为您做到了这一点.在AssemblyInfo.cs文件中,将程序集版本设置为major.minor.*(例如:1.0.*).

构建项目时,将自动生成版本.

我相信,构建和修订号是根据日期生成的,使用unix时代.构建基于当天,并且修订基于自午夜以来的秒数.

  • <ring,ring>"你好,产品支持我怎么可以帮忙?" <customer>"我有一个错误"<support>"好的,你在运行什么版本?" <客户>"版本一点二修改八五二五三七四建七四六三五二九......"<支持>"坚持,只需输入它...嗯...请重复版本数字,我们似乎没有列出那个版本和修订......" - GRRR! (20认同)
  • @Jimbo:虽然我们都同意你的评论很有趣,但实际上并不重要.当您谈到您的VS安装时,您是否拥有Visual Studio 2008 SP1或VS2008 9.0.30729.1 SP?使用自动增量构建数是一种非常常见的方案,并且可以通过在发布版本发布时增加主要/次要版本号来非常容易地"修复". (8认同)
  • 视觉工作室中的自动增量非常糟糕. (3认同)

Ton*_*nyG 8

我从来没有真正看到1.0.*功能在VS2005或VS2008中工作.是否需要设置VS来增加值?

如果AssemblyInfo.cs用1.0.*进行硬编码,那么真实的构建/修订版存储在哪里?

在AssemblyInfo中放入1.0.*之后,我们不能使用以下语句,因为ProductVersion现在具有无效值 - 它使用1.0.*而不是VS分配的值:

Version version = new Version(Application.ProductVersion);
Run Code Online (Sandbox Code Playgroud)

叹息 - 这似乎是每个人都要问的事情之一,但不知怎的,从来没有一个可靠的答案.几年前,我看到了生成修订号的解决方案,并将其保存到AssemblyInfo中,作为构建后过程的一部分.我希望VS2008不需要那种舞蹈.也许VS2010?

  • 您必须删除AssemblyFileVersion.除此之外,它为我们制作出了令人敬畏的答案. (10认同)

小智 5

我假设有人也可以使用文本模板执行此操作,您可以在环境中动态创建有问题的程序集属性,如下面的AssemblyVersion.tt所示.

<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ output extension=".cs" #>
<#
var build = Environment.GetEnvironmentVariable("BUILD_NUMBER");
build = build == null ? "0" : int.Parse(build).ToString();
var revision = Environment.GetEnvironmentVariable("SVN_REVISION");
revision = revision == null ? "0" : int.Parse(revision).ToString();    
#>
using System.Reflection;
[assembly: AssemblyVersion("1.0.<#=build#>.<#=revision#>")]
[assembly: AssemblyFileVersion("1.0.<#=build#>.<#=revision#>")]
Run Code Online (Sandbox Code Playgroud)