VS版本號定義、規則和相關的Visual Studio插件

軟件版本號主要標識了軟件的版本,經過其能夠了解軟件、類庫文件的當前版本,使得軟件版本控制有所依據。

咱們就Windows系統和.NET Framework的編號規則來看,軟件版本號的定義結構通常是這樣:html

主版本號.子版本號.編譯版本號.修正版本號安全

咱們也能夠在項目屬性上能夠看到相關設置的界面,對應的英文名稱分別爲:major.minor.build.revisionvisual-studio

Major:具備相同名稱但不一樣主版本號的程序集不可互換。例如,這適用於對產品的大量重寫,這些重寫使得沒法實現向後兼容性。當有極大的更新時,會增長major的版號。測試

Minor:若是兩個程序集的名稱和主版本號相同,而次版本號不一樣,這指示顯著加強,但照顧到了向後兼容性。例如,這適用於產品的修正版或徹底向後兼容的新版本。而當有大更新,但不至於更新major時,會更新minor的版號。優化

Build:內部版本號的不一樣表示對相同源所做的從新編譯。這適合於更改處理器、平臺或編譯器的狀況。若更新比較小,例如只是除蟲(bug fixing),則會更新build的版號。ui

Revision:名稱、主版本號和次版本號都相同但修訂號不一樣的程序集應是徹底可互換的。這適用於修復之前發佈的程序集中的安全漏洞。程序集的只有內部版本號或修訂號不一樣的後續版本被認爲是先前版本的修補程序 (Hotfix) 更新。當在同一個Build下須要從新編譯,那麼就須要增長Revision便可。spa

從msdn看到最大值爲「a maximum value of F:System.UInt16.MaxValue - 1,也就是 65534.net

因此通常的版本信息設置看起來應該是這樣:插件

1
1.1
1.1.*
1.1.1
1.1.1.*
1.1.1.13d

2. .NET裏自動編號的方法

在設置頁面裏有一個是程序集版本號,一個是文件版本號。文件版本號主要用來爲文件作標識,而程序集版本號用於CLR識別使用。

在咱們肯定了主版本號和子版本號後,編譯版本號和修正版本號就須要在每次編譯的時候去變更了,這樣在程序測試、排錯時才能快速定位到使用的是哪一個編譯出的版本,而不只僅是經過文件建立時間去辨別。

在.NET裏面提供了一個方法去自動對編譯版本號和修正版本號進行設置的方法。

首先咱們須要知道經過界面設置的版本信息是存儲在項目裏的AssemblyInfo.cs文件裏的。

默認的設置是這樣。

1 [assembly: AssemblyVersion("1.0.0.0")]
2 [assembly: AssemblyFileVersion("1.0.0.0")]

咱們須要將主版本號和子版本號填寫好,由於這部分是不會頻繁變更的,而編譯版本使用通配符*代替,並將文件版本信息註釋掉,設置起來像這樣。

1 [assembly: AssemblyVersion("1.0.*")]
2 //[assembly: AssemblyFileVersion("1.0.0.0")]  //若是須要自動增長版本號,須要註釋這句代碼,只用上面的一行

這樣設置後生成的規則就是:編譯版本號是自2000年1月1日以來的天數,而修正版本號會是當天自午夜零點以來的秒數除以2所得的值。

咱們看一個編譯後的結果。

3. 相關的Visual Studio插件

上面.NET提供自動編號的方法在解決方案裏有不少項目且想統一管理其版本號時就不能知足需求了,要保持統一就要每次編譯前手動統一全部的版本信息了。

還好咱們找到了一個插件:Versioning Controlled Build ,這裏是做者的CodeProject上面的主頁,裏面有項目和使用方法的介紹。

在這裏面能夠統一管理解決方案裏面的全部項目,能夠按照本身的項目統一修改對應的版本號。

而在插件設置裏面還提供了更多的選項已知足不一樣的自動編號需求。

更多的功能各位能夠按照本身的需求去摸索與配置了。

由於CodeProject下載須要註冊登陸,爲了方便下載我把插件放在了這裏,點擊下載

 

出處:https://blog.csdn.net/cnhk1225/article/details/37500593

==============================================================================

我在使用VS2017建立的類庫的項目的時候,想按照上面的說的[assembly: AssemblyVersion("1.0.*")]來自動增長版本號的,可是修改後,在編譯的時候出錯,錯誤提示以下:

錯誤 CS8357 指定的版本字符串中包含與肯定性不兼容的通配符。從版本字符串刪除通配符,或者禁用此編譯的肯定性 PVG.Lib ....\PVG.Lib\Properties\AssemblyInfo.cs 35

這個狀況我就奇怪了,爲何個人其餘的項目均可以用,這個項目不能夠這樣用?因而我又建立了一些其餘的類庫等進行測試,一樣的問題。從錯誤提示看應該是項目的配置不正確。

不死心啊,打開以前正常的自動版本號的程序和這個項目的文件(.csproj)進行比較,去掉項目文件和引用等,其實兩個項目文件不一樣的地方很少,那就一個一個是試試,究竟是哪一個項目屬性影響致使的問題。當試到<Deterministic>True</Deterministic>的時候,發現我新建的項目都是true,而以前的項目這個屬性是false,修改爲fasle編譯測試,經過了,不報錯了。因而拿<Deterministic>到網上查,說是.NET Core默認的設置。
因爲時間比較緊,也沒細查其餘的,等有空了在查<Deterministic>的說明

-------------------------------------------------------------------------------------

再提供幾個其餘方式實現版本號的思路吧:
將增量(DateTime)信息添加到AssemblyFileVersion屬性中,該屬性具備不破壞任何依賴性的優勢。
你能夠結合使用預生成事件生成文件,添加該文件(包括其版本屬性)而後使用一種方法來讀出那些價值再次。
那是在項目的預生成,事件中:
echo [assembly:System.Reflection.AssemblyFileVersion("%date:~0,4%.%date:~5,2%%date:~8,2%.%time:~0,2%%time:~3,2%.%time:~6,2%")] > $(ProjectDir)Properties\VersionInfo.cs

將生成的VersionInfo.cs文件(Properties子文件夾)包含到項目中.

注意:

1)寫入的文件路徑有空格的時候,建議使用雙引號

2)寫入的文件名能夠本身指定,最好和功能相對應

3)版本號的最大值是65535,因此使用AssemblyFileVersion不受這個限制。

全部通過優化能夠以下代碼:

set t=%time: =0%
echo [assembly: System.Reflection.AssemblyFileVersion("%date:~0,4%.%date:~5,2%.%date:~8,2%.%t:~0,2%%t:~3,2%%t:~6,2%")] > "$(ProjectDir)Properties\FileVersionInfo.cs"

 


-------------------------------------------------------------------------------------
Cake支持AssemblyInfo文件修補。手中拿着蛋糕,你能夠經過無限的方式實現自動版本遞增。
像C#編譯器那樣遞增版本的簡單示例:
Setup(() =>
{
// Executed BEFORE the first task.
var datetimeNow = DateTime.Now;
var daysPart = (datetimeNow - new DateTime(2000, 1, 1)).Days;
var secondsPart = (long)datetimeNow.TimeOfDay.TotalSeconds/2;
var assemblyInfo = new AssemblyInfoSettings
{
Version = "3.0.0.0",
FileVersion = string.Format("3.0.{0}.{1}", daysPart, secondsPart)
};
CreateAssemblyInfo("MyProject/Properties/AssemblyInfo.cs", assemblyInfo);
});

 

參考:https://stackoverflow.com/questions/356543/can-i-automatically-increment-the-file-build-version-when-using-visual-studio

相關文章
相關標籤/搜索