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在下次扫描时触发新的构建.我不是在找人为我做任何事情,只是指出我正确的方向,也许是让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
这是一个优雅的解决方案,在添加新项目时需要先做一些工作,但很容易处理这个过程.
我们的想法是每个项目都链接到一个只包含程序集版本信息的解决方案文件.因此,您的构建过程只需更新单个文件,并在编译时从一个文件中提取所有程序集版本.
脚步:
将文件添加为链接时,它会将数据存储在项目文件中,并在编译时从此文件中提取程序集版本信息.
在源代码管理中,添加一个bat文件或脚本文件,只是递增SharedAssemblyProperties.cs文件,所有项目都将从该文件更新其程序集信息.
Mat*_*ord 11
可以将Hudson配置为忽略对某些路径和文件的更改,以便它不会提示新的构建.
在作业配置页面的" 源代码管理"下,单击" 高级"按钮.在" 排除区域"框中,输入一个或多个正则表达式以匹配排除项.
例如,要忽略对version.properties文件的更改,您可以使用:
/MyProject/trunk/version.properties
Run Code Online (Sandbox Code Playgroud)
这适用于C#以外的语言,并允许您将版本信息存储在subversion中.
.NET为您做到了这一点.在AssemblyInfo.cs文件中,将程序集版本设置为major.minor.*(例如:1.0.*).
构建项目时,将自动生成版本.
我相信,构建和修订号是根据日期生成的,使用unix时代.构建基于当天,并且修订基于自午夜以来的秒数.
我从来没有真正看到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?
小智 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)