

使用 global.json 精準的選擇 .NET SDK 版本
source link: https://blog.miniasp.com/post/2021/06/04/Choose-the-right-DotNet-SDK-version-using-global-json
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

我在 2018 年寫過一篇 如何在多個 .NET Core SDK 版本之間進行切換 (global.json) 文章,當時只說明了你如何選擇特定版本,沒有提到當有新版 .NET SDK 出現時,他會怎樣選擇版本。這篇文章我打算來補完這部分技術細節。
首先,各位先看看我目前電腦的 .NET SDK 安裝情況,我從 .NET Core 3.1 到 .NET 6 Preview 都有安裝:
C:\NETSDK>dotnet --version
6.0.100-preview.4.21255.9
C:\NETSDK>dotnet --list-sdks
3.1.100 [C:\Program Files\dotnet\sdk]
3.1.115 [C:\Program Files\dotnet\sdk]
3.1.201 [C:\Program Files\dotnet\sdk]
3.1.301 [C:\Program Files\dotnet\sdk]
3.1.302 [C:\Program Files\dotnet\sdk]
3.1.402 [C:\Program Files\dotnet\sdk]
3.1.409 [C:\Program Files\dotnet\sdk]
5.0.104 [C:\Program Files\dotnet\sdk]
5.0.203 [C:\Program Files\dotnet\sdk]
5.0.300 [C:\Program Files\dotnet\sdk]
6.0.100-preview.4.21255.9 [C:\Program Files\dotnet\sdk]
在沒有
global.json
檔案的情況下,預設 .NET SDK 只會選擇目前的最新版本。
事實上,專案團隊中的每個人安裝的 .NET SDK 版本不盡相同,例如有的人安裝了 5.0.202
版,由些人則安裝了 5.0.203
版,那麼我們的 global.json
應該設定哪個版本才好呢?答案是:設定主要版本的第一版! 例如:3.1.100
或 5.0.100
等等。
假設我就在我的電腦執行以下命令,建立 global.json
檔案:
dotnet new globaljson --sdk-version 5.0.100
{
"sdk": {
"version": "5.0.100"
}
}
由於我的電腦並沒有 5.0.100
版本,所以當我執行 dotnet --version
我會得到 5.0.104
這個版本:
G:\NETSDK>dotnet new globaljson --sdk-version 5.0.100
The template "global.json file" was created successfully.
G:\NETSDK>type global.json
{
"sdk": {
"version": "5.0.100"
}
}
G:\NETSDK>dotnet --version
5.0.104
這也意味著著:【當 .NET SDK 無法透過 global.json
找到相對應版本時,它會自動找出往後最新的主要 SDK 版本】
如果你設定的 .NET SDK 版本在開發者的電腦有安裝的話,就會直接選擇特定版本。
認識 .NET SDK 的版本定義
我以 3.1.115
版本為例,這個版號可以區分成以下幾種:
-
主要版本 (Major)
3
版號第一段的數字。
-
次要版本 (Minor)
版號第二段的數字。
-
功能版本 (Feature)
版號第三段的第一個數字。
-
修補版本 (Patch)
版號第三段的最後兩個數字。
如何更佳精準的控制 .NET SDK 選用版本
為了能夠更精準的控制版本的跳躍,以下我用 .NET Core 3.1 來當示範整個步驟。
-
建立
global.json
選用 .NET Core SDK3.1.100
版本dotnet new globaljson --sdk-version 3.1.100
{ "sdk": { "version": "3.1.100" } }
因為我的電腦正好有安裝
3.1.100
這個 .NET SDK 版本,此時你用dotnet --version
會得到3.1.100
版本! -
我們將
global.json
加入sdk.rollForward
屬性,並設定為latestPatch
{ "sdk": { "version": "3.1.100", "rollForward": "latestPatch" } }
此時你會發現,因為定義
sdk.rollForward
屬性為latestPatch
的關係,我們用dotnet --version
會得到3.1.115
版本! -
我們將
global.json
的sdk.rollForward
屬性修改為latestFeature
{ "sdk": { "version": "3.1.100", "rollForward": "latestFeature" } }
此時你會發現,因為定義
sdk.rollForward
屬性為latestFeature
的關係,我們用dotnet --version
會得到3.1.409
版本! -
我們將
global.json
的sdk.rollForward
屬性修改為latestMinor
{ "sdk": { "version": "3.1.100", "rollForward": "latestMinor" } }
因為我們並沒有
3.2
版可用,定義sdk.rollForward
屬性為latestMinor
將會與latestFeature
的結果一模一樣,我們用dotnet --version
會得到3.1.409
版本! -
我們將
global.json
的sdk.rollForward
屬性修改為latestMajor
{ "sdk": { "version": "3.1.100", "rollForward": "latestMajor" } }
因為定義
sdk.rollForward
屬性為latestMajor
的關係,我們用dotnet --version
會得到6.0.100-preview.4.21255.9
版本!請注意!上述設定直接讓 .NET SDK 跳到最新預覽版了,如果你只希望套用到最新穩定版的話,可以調整設定如下:
{ "sdk": { "version": "3.1.100", "rollForward": "latestMajor", "allowPrerelease": false } }
這個也是我最喜歡的
globaljson
設定值! -
我們將
global.json
的sdk.rollForward
屬性修改為disable
{ "sdk": { "version": "3.1.100", "rollForward": "disable" } }
因為定義
sdk.rollForward
屬性為disable
的關係,我們用dotnet --version
會得到3.1.100
版本!注意:使用
disable
設定後,如果開發人員沒有安裝確切的指定版本, 完全無法使用 .NET SDK 了!
以上這幾個就很夠用了,其他的就沒有很重要。
使用 *
(萬用字元) 標示版本
如果你在 global.json
使用 *
(萬用字元) 標示版本的話,如下:
{
"sdk": {
"version": "3.1.*",
"rollForward": "latestMajor",
"allowPrerelease": false
}
}
不管你設定什麼版本,任何無效的版本對 .NET SDK 來說,就等同於這份 global.json
不存在一樣。只要這份 global.json
的 JSON 格式正確,基本上 .NET SDK 執行的時候就不會報錯,所以你寫這樣也是會過的:
{
"sdk": {
"version": "3.1.100",
"rollForward": "latestWhatever",
"allowPrerelease": false
}
}
既然都視為不存在,.NET SDK 就會自動選擇目前的最新主要、次要、功能、修補版本,反正是最新版就對了!
所以上述的兩種錯誤設定,由於執行 .NET SDK 的工具時都不會報錯,所以很有可能會讓你覺得這是應該是正確的設定,各位要千萬小心,不要自己腦補邏輯進去。
你可以用 dotnet --version
測試看看,錯誤的設定將會得到 6.0.100-preview.4.21255.9
版本! 🔥
Recommend
-
10
CentOS 時代即將終結,再談 Linux 版本選擇 2020-12-12 11:45 PM 21 14,457 RedHat 公司在 12/8 宣告,原本支...
-
4
Neovim 在選擇檔案名稱時的操作按鍵 在 Neovim 時操作檔案名稱時會是下拉選單,在 insert mode 時的畫面是這樣 (進到 insert mode 後 Ctrl-X + F): 這時候可以用上下鍵選擇檔案名稱。 在 comma...
-
6
在 Hacker News 上看到選擇公理 沒想到會在 Hacker News 的首頁上看到這麼硬核的主題,選擇公理 (
-
4
今年在 Cloud Summit 會議上分享『初探 Infrastructure as Code 工具...
-
6
用 Markdown 寫技術文件 我在三年前改用 Markdown 寫部落格,著眼點在省去改樣式、設連結、調位置... 等無謂的排版工夫,全力專注在文字內容上(謎:那錯字還那麼多是為什麼...
-
5
讓市場有更多不一樣的選擇,HyperX Alloy Origins 65% 紅軸機械鍵盤動手玩 不知道從什麼時候開始,機械鍵盤已經成為玩家們人手一把的必需品。 機械鍵盤,不知道怎麼又重回到我們日常,而且隨著市場逐漸變大,...
-
10
C# 4 dynamic、選擇性參數及 Generic Variance-黑暗執行緒 【本系列是我的 C# in Depth 第四版讀書筆記,背景故事在這裡】 C# 4 帶來的一大改變...
-
26
C# 區域函式傳回多元資料的做法選擇
-
4
Azure 學習筆記 - 選擇 VM 大小與區域 2022-12-04 07:46 AM 0
-
3
在 CSS 裡面使用系統字型的選擇 一開始是看到「Show HN: Modern Font Stacks – New system...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK