日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Dotnet Core使用特定的SDKRuntime版本

發布時間:2023/12/4 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Dotnet Core使用特定的SDKRuntime版本 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Dotnet Core的SDK版本總在升級,怎么使用一個特定的版本呢?

?

假期過完了,心情還在。今天寫個短的。

一、前言

寫這個是因為昨天刷微軟官方文檔,發現global.json在 SDK 3.0 后,更新了一些內容。文檔提到了這個更新,但規則說的不太清楚,所以研究了一下,成了這個文章。

?

先普及一下 .Net Core Runtime 和 .Net Core SDK 的區別,如果清楚,這段可以直接跳過。

我們用命令

%?dotnet?--list-sdks

查看已安裝的Dotnet框架時,會查到類似于下面的內容:

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 Runtime - 運行時框架。顧名思義,就是.Net Core應用運行時需要使用的框架/庫。這個框架很小,只能用于運行編譯后的代碼。也就是說,編譯后的程序運行時,會調用這個框架里的庫。

  • .Net Core SDK - 這個框架很大,是用來做除了運行以外的其它部分:編譯、調試應用,以下管理NuGet包等等。當我們開發時,主要用的是這個框架。

所以,在開發機器上我們就需要安裝 SDK 和 Runtime 兩個框架,而在生產機器上,就僅安裝 Runtime 就好了。

同時,SDK 和 Runtime 是對應的,一個特定版本的 SDK,總會對應一個特定版本的 Runtime。

在微軟的體系中,.Net Core SDK 是向后兼容的,SDK 3.1 完全可以用來構建 SDK 2.2 類似的應用程序。換句話說,通常不用指定特定版本的SDK來構建應用,用最高的版本就可以。

但是,因為不同的版本,有不同的支持內容,和不同的特性,所以總有些應用是無法兼容的。因此,需要指定特定的 Runtime 版本。

二、指定特定的SDK版本

前面說了,因為 SDK 向后兼容,通常我們不需要關心安裝了哪個版本的 SDK。

但是,總有一些情況會出現:特定版本的BUG、特性變化、項目模板的改變等,導致項目需要某一特定的 SDK 版本。這個時候,我們會用到global.json。

應用在執行時,dotnet.exe會在項目目錄中查找global.json文件,并根據global.json文件的內容來決定使用哪個 SDK 版本來運行應用。當global.json不存在時,就使用當前最新的 SDK 版本。

?

按照微軟的說法,應用SDK版本的規則如下:

  • 安裝了哪個版本的SDK;

  • global.json定義使用哪個版本的SDK;

  • 當前SDK版本的前滾策略是什么;

  • 是否允許使用預發布版本;

  • 我們也依照這些因素來說明這個問題。

    2.1 檢查已安裝的版本

    在本文開頭,給出了一個命令:

    %?dotnet?--list-sdks

    這個命令,可以列出已經安裝的所有 SDK 及版本號。

    ?

    微軟的版本號會有點復雜,這里舉個例子解釋一下,2.1.602:

    • 最前邊的 2,是主版本號;

    • 中間的 1,是副版本號;

    • 后面的三個數中第一個數是特征版本號,在本例子中,是6;

    • 后面三個數中后兩個數是補丁版本號,在本例中是02,表示第6個特征版本的第2個補丁。

    通常我們在說版本時,一般說到的就是主版本號和副版本號。比方 .Net Core SDK 3.1,就是指主版本為3,副版本為1的版本。

    這個版本號,在前滾策略中會很重要。

    2.2 global.json

    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"} }

    在這個設置,有三個參數:

    • version : 設置的特定版本。如果沒有設置,將采用安裝的最高版本

    • allowPrerelease :計算使用版本時,是否考慮使用?prerelease或preview的SDK版本

    • rollForward :要應用的前滾策略?

    這是微軟對global.json參數判斷的流程,供參考。

    ?

    下面,我們重點說一下前滾策略參數。

    2.3 前滾策略參數

    前滾策略用于確定在請求給定版本時應該選擇已安裝的 SDK 中的哪一個。通過更改前滾策略,您可以放松或收緊選擇條件。這個說法有點抽象,我們舉幾個例子來說。

    在 .Net Core 3.0中,前滾策略有三個類,九個值:

    禁用策略:

    • disable - 禁用前滾。如果沒有確定的版本,就報錯。也就是說,不允許使用除指定的版本外的其它任何版本。

    保守策略(比禁用要寬松一點):

    • patch - 如果版本不存在,就使用相同主、副、特征版本下的最高版本,沒有就報錯。以上面的例子來說,會使用 2.1.604 版本

    • feature - 優先套用 patch 策略;如果不存在,就使用主、次版本相同的下一個特征版本,如 2.1.7xx,沒有就報錯

    • minor - 優先套用 feature 策略;如果不存在,就使用主版本相同的最大版本 2.x.xxx,如本例中的 2.2.203

    • major - 優先套用 minor 策略;如果不存在,就使用已安裝的最大版本 x.x.xxx,如本例中的3.1.101

    最新策略(最寬松的策略):

    • latestPatch - 始終使用相同主、副、特征版本下的最高版本 2.1.6xx

    • latestFeature - 始終使用相同主、副版本下的最高版本 2.1.xxx

    • latestMinor - 始終使用相同主版本下的最高版本 2.x.xxx

    • latestMajor - 始終使用已安裝的最高版本

    出于對 .Net Core 3.0 以前的配置進行兼容,以前的設置會自動采用 latestMajor 設置。

    三、總結

    一般來說,應用開發中盡可能不要使用global.json。因為限定了運行時版本,會讓生產環境變得復雜。

    如果必須使用global.json,以我的經驗,建議指定最低的 SDK 版本,并適當地應用 latestMinor 或 latestFeature 策略。這可能確保項目可以由更多的 SDK 版本進行構建和運行。

    (全文完)

    喜歡就來個三連,讓更多人因你而受益

    總結

    以上是生活随笔為你收集整理的Dotnet Core使用特定的SDKRuntime版本的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。