Dotnet Core的SDK版本總在升級,怎麼使用一個特定的版本呢?css
假期過完了,心情還在。今天寫個短的。html
寫這個是由於昨天刷微軟官方文檔,發現global.json
在 SDK 3.0 後,更新了一些內容。文檔提到了這個更新,但規則說的不太清楚,因此研究了一下,成了這個文章。json
先普及一下 .Net Core Runtime 和 .Net Core SDK 的區別,若是請楚,這段能夠直接跳過。bash
咱們用命令微信
% dotnet --list-sdks
查看已安裝的Dotnet框架時,會查到相似於下面的內容:app
1.1.14 [/usr/local/share/dotnet/sdk]
2.1.600 [/usr/local/share/dotnet/sdk]
2.1.602 [/usr/local/share/dotnet/sdk]
2.1.604 [/usr/local/share/dotnet/sdk]
2.1.700 [/usr/local/share/dotnet/sdk]
2.1.801 [/usr/local/share/dotnet/sdk]
2.2.203 [/usr/local/share/dotnet/sdk]
3.0.100 [/usr/local/share/dotnet/sdk]
3.1.101 [/usr/local/share/dotnet/sdk]
能夠看到,咱們安裝了兩類的東西,.Net Core SDK 和 .Net Core Runtime,而且各自對應的版本。其實,SDK 和 Runtime 各有各的用處:框架
.Net Core
應用運行時須要使用的框架/庫。這個框架很小,只能用於運行編譯後的代碼。也就是說,編譯後的程序運行時,會調用這個框架裏的庫。因此,在開發機器上咱們就須要安裝 SDK 和 Runtime 兩個框架,而在生產機器上,就僅安裝 Runtime 就行了。ui
同時,SDK 和 Runtime 是對應的,一個特定版本的 SDK,總會對應一個特定版本的 Runtime。spa
在微軟的體系中,.Net Core SDK 是向後兼容的,SDK 3.1 徹底能夠用來構建 SDK 2.2 相似的應用程序。換句話說,一般不用指定特定版本的SDK來構建應用,用最高的版本就能夠。調試
可是,由於不一樣的版本,有不一樣的支持內容,和不一樣的特性,因此總有些應用是沒法兼容的。所以,須要指定特定的 Runtime 版本。
爲防止非受權轉發,這兒給出本文的原文連接:http://www.javashuo.com/article/p-bwnwilaw-nu.html
前面說了,由於 SDK 向後兼容,一般咱們不須要關心安裝了哪一個版本的 SDK。
可是,總有一些狀況會出現:特定版本的BUG、特性變化、項目模板的改變等,致使項目須要某一特定的 SDK 版本。這個時候,咱們會用到global.json
。
應用在執行時,dotnet.exe
會在項目目錄中查找global.json
文件,並根據global.json
文件的內容來決定使用哪一個 SDK 版原本運行應用。當global.json
不存在時,就使用當前最新的 SDK 版本。
按照微軟的說法,應用SDK版本的規則以下:
咱們也依照這些因素來講明這個問題。
在本文開頭,給出了一個命令:
% dotnet --list-sdks
這個命令,能夠列出已經安裝的全部 SDK 及版本號。
微軟的版本號會有點複雜,這裏舉個例子解釋一下,2.1.602:
一般咱們在說版本時,通常說到的就是主版本號和副版本號。比方 .Net Core SDK 3.1,就是指主版本爲3,副版本爲1的版本。
這個版本號,在前滾策略中會很重要。
global.json
文件從 .Net Core 1.0就開始引入了。
早期(.Net Core 3.0以前)的內容很簡單:
{
"sdk": {
"version": "2.1.600"
}
}
在這個版本中,global.json
文件僅定義了應用使用哪一個版本的 SDK。運行時,若是安裝對應版本的 SDK,就會正常使用 SDK 並啓動。若是不存在對應的 SDK,則會報錯:
A compatible installed .NET Core SDK for global.json version [2.1.600] from [.\global.json] was not found
Install the [2.1.600] .NET Core SDK or update [.\global.json] with an installed .NET Core SDK
這個階段的global.json
使用單一版本號,而且不支持通配符。
在必定程序上,這個設置能夠解決一些版本方面的問題。但也帶來了新的問題。
咱們看上面的定義, version
字段的值定義到了版本號的特徵版本號和補丁版本號。也就是說,它定義了單一的一個精確版本號。這使得咱們不能使用同主副版本的其它任何 SDK 版本,哪怕它是一個更好或更新的版本。
這個問題在 .Net Core 3.0 後有了新的改善。
.Net Core 3.0 後,global.json
增長了兩個字段:rollForward
和allowPrerelease
:
{
"sdk": {
"version": "2.1.600",
"allowPrerelease": true,
"rollForward": "patch"
}
}
在這個設置,有三個參數:
prerelease
或preview
的SDK版本這是微軟對global.json
參數判斷的流程,供參考。
下面,咱們重點說一下前滾策略參數。
前滾策略用於肯定在請求給定版本時應該選擇已安裝的 SDK 中的哪個。經過更改前滾策略,您能夠放鬆或收緊選擇條件。這個說法有點抽象,咱們舉幾個例子來講。
在 .Net Core 3.0中,前滾策略有三個類,九個值:
禁用策略:
保守策略(比禁用要寬鬆一點):
最新策略(最寬鬆的策略):
出於對 .Net Core 3.0 之前的配置進行兼容,之前的設置會自動採用 latestMajor 設置。
通常來講,應用開發中儘量不要使用global.json
。由於限定了運行時版本,會讓生產環境變得複雜。
若是必須使用global.json
,以個人經驗,建議指定最低的 SDK 版本,並適當地應用 latestMinor 或 latestFeature 策略。這可能確保項目能夠由更多的 SDK 版本進行構建和運行。
(全文完)
![]() |
微信公衆號:老王Plus 掃描二維碼,關注我的公衆號,能夠第一時間獲得最新的我的文章和內容推送 本文版權歸做者全部,轉載請保留此聲明和原文連接 |