<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Dotnet Core使用特定的SDK&Runtime版本

          共 3642字,需瀏覽 8分鐘

           ·

          2020-10-16 00:53

          Dotnet Core的SDK版本總在升級(jí),怎么使用一個(gè)特定的版本呢?

          ?

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

          一、前言

          寫這個(gè)是因?yàn)樽蛱焖⑽④浌俜轿臋n,發(fā)現(xiàn)global.json在 SDK 3.0 后,更新了一些內(nèi)容。文檔提到了這個(gè)更新,但規(guī)則說的不太清楚,所以研究了一下,成了這個(gè)文章。

          ?

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

          我們用命令

          %?dotnet?--list-sdks

          查看已安裝的Dotnet框架時(shí),會(huì)查到類似于下面的內(nèi)容:

          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,并且各自對(duì)應(yīng)的版本。其實(shí),SDK 和 Runtime 各有各的用處:

          • .Net Core Runtime - 運(yùn)行時(shí)框架。顧名思義,就是.Net Core應(yīng)用運(yùn)行時(shí)需要使用的框架/庫。這個(gè)框架很小,只能用于運(yùn)行編譯后的代碼。也就是說,編譯后的程序運(yùn)行時(shí),會(huì)調(diào)用這個(gè)框架里的庫。

          • .Net Core SDK - 這個(gè)框架很大,是用來做除了運(yùn)行以外的其它部分:編譯、調(diào)試應(yīng)用,以下管理NuGet包等等。當(dāng)我們開發(fā)時(shí),主要用的是這個(gè)框架。

          所以,在開發(fā)機(jī)器上我們就需要安裝 SDK 和 Runtime 兩個(gè)框架,而在生產(chǎn)機(jī)器上,就僅安裝 Runtime 就好了。

          同時(shí),SDK 和 Runtime 是對(duì)應(yīng)的,一個(gè)特定版本的 SDK,總會(huì)對(duì)應(yīng)一個(gè)特定版本的 Runtime。

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

          但是,因?yàn)椴煌陌姹荆胁煌闹С謨?nèi)容,和不同的特性,所以總有些應(yīng)用是無法兼容的。因此,需要指定特定的 Runtime 版本。

          二、指定特定的SDK版本

          前面說了,因?yàn)?SDK 向后兼容,通常我們不需要關(guān)心安裝了哪個(gè)版本的 SDK。

          但是,總有一些情況會(huì)出現(xiàn):特定版本的BUG、特性變化、項(xiàng)目模板的改變等,導(dǎo)致項(xiàng)目需要某一特定的 SDK 版本。這個(gè)時(shí)候,我們會(huì)用到global.json

          應(yīng)用在執(zhí)行時(shí),dotnet.exe會(huì)在項(xiàng)目目錄中查找global.json文件,并根據(jù)global.json文件的內(nèi)容來決定使用哪個(gè) SDK 版本來運(yùn)行應(yīng)用。當(dāng)global.json不存在時(shí),就使用當(dāng)前最新的 SDK 版本。

          ?

          按照微軟的說法,應(yīng)用SDK版本的規(guī)則如下:

          1. 安裝了哪個(gè)版本的SDK;

          2. global.json定義使用哪個(gè)版本的SDK;

          3. 當(dāng)前SDK版本的前滾策略是什么;

          4. 是否允許使用預(yù)發(fā)布版本;

          我們也依照這些因素來說明這個(gè)問題。

          2.1 檢查已安裝的版本

          在本文開頭,給出了一個(gè)命令:

          %?dotnet?--list-sdks

          這個(gè)命令,可以列出已經(jīng)安裝的所有 SDK 及版本號(hào)。

          ?

          微軟的版本號(hào)會(huì)有點(diǎn)復(fù)雜,這里舉個(gè)例子解釋一下,2.1.602:

          • 最前邊的 2,是主版本號(hào);

          • 中間的 1,是副版本號(hào);

          • 后面的三個(gè)數(shù)中第一個(gè)數(shù)是特征版本號(hào),在本例子中,是6;

          • 后面三個(gè)數(shù)中后兩個(gè)數(shù)是補(bǔ)丁版本號(hào),在本例中是02,表示第6個(gè)特征版本的第2個(gè)補(bǔ)丁。

          通常我們?cè)谡f版本時(shí),一般說到的就是主版本號(hào)和副版本號(hào)。比方 .Net Core SDK 3.1,就是指主版本為3,副版本為1的版本。

          這個(gè)版本號(hào),在前滾策略中會(huì)很重要。

          2.2 global.json

          global.json文件從 .Net Core 1.0就開始引入了。

          早期(.Net Core 3.0之前)的內(nèi)容很簡(jiǎn)單:

          {
          ??"sdk":?{
          ????"version":?"2.1.600"
          ??}
          }

          在這個(gè)版本中,global.json文件僅定義了應(yīng)用使用哪個(gè)版本的 SDK。運(yùn)行時(shí),如果安裝對(duì)應(yīng)版本的 SDK,就會(huì)正常使用 SDK 并啟動(dòng)。如果不存在對(duì)應(yīng)的 SDK,則會(huì)報(bào)錯(cuò):

          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

          這個(gè)階段的global.json使用單一版本號(hào),并且不支持通配符。

          在一定程序上,這個(gè)設(shè)置可以解決一些版本方面的問題。但也帶來了新的問題。

          我們看上面的定義,?version?字段的值定義到了版本號(hào)的特征版本號(hào)和補(bǔ)丁版本號(hào)。也就是說,它定義了單一的一個(gè)精確版本號(hào)。這使得我們不能使用同主副版本的其它任何 SDK 版本,哪怕它是一個(gè)更好或更新的版本。

          ?

          這個(gè)問題在 .Net Core 3.0 后有了新的改善。

          .Net Core 3.0 后,global.json增加了兩個(gè)字段:rollForwardallowPrerelease

          {
          ??"sdk":?{
          ????"version":?"2.1.600",
          ????"allowPrerelease":?true,
          ????"rollForward":?"patch"
          ??}
          }

          在這個(gè)設(shè)置,有三個(gè)參數(shù):

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

          • allowPrerelease :計(jì)算使用版本時(shí),是否考慮使用?prereleasepreview的SDK版本

          • rollForward :要應(yīng)用的前滾策略?

          這是微軟對(duì)global.json參數(shù)判斷的流程,供參考。

          ?

          下面,我們重點(diǎn)說一下前滾策略參數(shù)。

          2.3 前滾策略參數(shù)

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

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

          禁用策略:

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

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

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

          • feature - 優(yōu)先套用 patch 策略;如果不存在,就使用主、次版本相同的下一個(gè)特征版本,如 2.1.7xx,沒有就報(bào)錯(cuò)

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

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

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

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

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

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

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

          出于對(duì) .Net Core 3.0 以前的配置進(jìn)行兼容,以前的設(shè)置會(huì)自動(dòng)采用 latestMajor 設(shè)置。

          三、總結(jié)

          一般來說,應(yīng)用開發(fā)中盡可能不要使用global.json。因?yàn)橄薅诉\(yùn)行時(shí)版本,會(huì)讓生產(chǎn)環(huán)境變得復(fù)雜。

          如果必須使用global.json,以我的經(jīng)驗(yàn),建議指定最低的 SDK 版本,并適當(dāng)?shù)貞?yīng)用 latestMinor 或 latestFeature 策略。這可能確保項(xiàng)目可以由更多的 SDK 版本進(jìn)行構(gòu)建和運(yùn)行。

          (全文完)


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

          瀏覽 44
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  成人性爱豆花视频试看 | 欧美精品成人HD | 日韩逼逼 | 国产精品美女久久久 | 精品久久久久久 |