如何通過我們的 CI 平台 (Hudson) 自動增加 C# 程序集版本?
我和我的團隊在增加程序集版本號方面非常糟糕,我們經常使用 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 平台。
一個簡單的替代方法是讓 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.*")]
這是我所做的,用於標記 AssemblyFileVersion 屬性。
從 AssemblyInfo.cs 中刪除了 AssemblyFileVersion
將名為 AssemblyFileInfo.cs 的新空文件添加到項目中。
將MSBuild 社區任務工具集安裝在 hudson 建構機器上或作為項目中的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 上建構時,Hudson 提供了您在那裡看到的那些 env 變數(假設它是從 subversion 獲取的)。
在項目文件的底部,添加
<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>這使用 MSBuildCommunityTasks 生成 AssemblyFileVersion.cs 以在項目建構之前包含 AssemblyFileVersion 屬性。如果需要,您可以對任何/所有版本屬性執行此操作。
結果是,每當您發布 hudson 建構時,生成的程序集都會獲得 1.0.HUDSON_BUILD_NR.SVN_REVISION 的 AssemblyFileVersion 例如 1.0.6.2632 ,這意味著 hudson 中的第 6 個建構號,來自 subversion 修訂版 2632。