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

我自己和我的团队在增加程序集版本号方面非常可怕,我们经常以1.0.0.0版本发布程序集。 很明显,这会引起很多头痛。

通过我们的CI平台,我们的实践得到了很大改善,我真的希望将它设置为自动递增assemblyinfo.cs文件中的值,以便我们的程序集版本可以自动更新该组件。

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

哈德森是否将版本号增加为一个坏主意? 什么是替代方法呢?

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

  • 递增的版本号assemblyinfo.cs构建之前
  • 只增加已更改的程序集中的内部版本号。 这可能是不可能的,因为Hudson每次构建时都会擦除项目文件夹
  • 将更改的assemblyinfo.cs提交到代码库(当前为VisualSVN)
  • 下次扫描变化时,不会导致Hudson触发新的构建
  • 在我的脑海里解决这个问题,我可以很容易地通过批处理文件/命令想出一个解决方案,但是我所有的想法都会让Hudson在下次扫描时触发一个新的构建。 我不是在找人为我做所有事情,只是指向正确的方向,也许是让哈德森忽略某些SVN提交等技巧。

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


    一个简单的替代方法是让C#环境为您递增程序集版本,方法是将版本属性设置为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.*")]
    

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

    从AssemblyInfo.cs中删除了AssemblyFileVersion

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

    在哈德森构建机器上安装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>
    

    Hudson提供了在项目建立在哈德森上时看到的那些env变量(假设它是从颠覆中获取的)。

    在项目文件的底部,添加

     <Import Project="$(MSBuildExtensionsPath)MSBuildCommunityTasksMSBuild.Community.Tasks.Targets" Condition="Exists('$(MSBuildExtensionsPath)MSBuildCommunityTasksMSBuild.Community.Tasks.Targets')" />
      <Target Name="BeforeBuild" Condition="Exists('$(MSBuildExtensionsPath)MSBuildCommunityTasksMSBuild.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>
    

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

    结果是,无论何时发出哈德森版本,生成的程序集都会得到1.0.HUDSON_BUILD_NR.SVN_REVISION的AssemblyFileVersion,例如1.0.6.2632,这意味着哈德森版本的第6版build#将从Subversion版本2632中引出。


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

    这个想法是,每个项目链接到一个只包含程序集版本信息的解决方案文件。 所以你的编译过程只需要更新一个文件,编译时从一个文件中取出所有的程序集版本。

    脚步:

  • 为你的解决方案文件* .cs文件添加一个类,我将其命名为min SharedAssemblyProperties.cs
  • 从新文件中删除所有cs信息
  • 从AssemblyInfo文件中剪切程序集信息:[assembly:AssemblyVersion(“1.0.0.0”)] [assembly:AssemblyFileVersion(“1.0.0.0”)]
  • 添加语句“using System.Reflection;” 添加到文件中,然后将数据粘贴到新的cs文件中(例如SharedAssemblyProperties.cs)
  • 将项目添加到项目中(等待...在添加文件之前阅读)
  • 选择文件,然后单击添加,然后单击添加按钮旁边的下拉列表并选择“添加为链接”。
  • 对解决方案中的所有现有项目和新项目重复步骤5和6
  • 将文件作为链接添加时,会将数据存储在项目文件中,并在编译时从该文件中提取程序集版本信息。

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

    链接地址: http://www.djcxy.com/p/8943.html

    上一篇: How can I auto increment the C# assembly version via our CI platform (Hudson)?

    下一篇: Android home screen widget mysteriously fails to receive touch events