久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

快速搞懂.NET 5/.NET Core應(yīng)用程序的發(fā)布部署

 喜歡站在山上 2021-02-18

背景

.NET Framework時(shí)代,.NET 應(yīng)用程序大多直接部署運(yùn)行在Windows服務(wù)器上,。無(wú)論部署exe,,還是IIS站點(diǎn)、或是Windows Service,,編譯后的程序直接copy,、簡(jiǎn)單配置部署上即可,。

有了.NET Core之后,.NET應(yīng)用程序完美支持跨平臺(tái)部署,。

支持跨平臺(tái)部署運(yùn)行,,.NET 5/.NET Core的應(yīng)用程序面臨著多平臺(tái),多場(chǎng)景的部署需求,。比如說(shuō):部署在Windows,、Linux、MaxOS...,,OS層面是否需要部署.NET Runtime運(yùn)行時(shí),,.NET Runtime運(yùn)行時(shí)的版本選擇,等等,。

因此,,今天我們研究一下.NET 5/.NET Core應(yīng)用程序的部署發(fā)布。

兩種應(yīng)用程序發(fā)布模式

1. 以自包含的方式發(fā)布應(yīng)用程序

這種模式包含.NET運(yùn)行時(shí)和應(yīng)用程序及其依賴項(xiàng)的應(yīng)用程序,。我們可以在未安裝.NET運(yùn)行時(shí)的操作系統(tǒng)上運(yùn)行它,。

總結(jié)一句話:把.NET Runtime運(yùn)行時(shí)打包到程序運(yùn)行目錄中,應(yīng)用程序運(yùn)行的主機(jī)不需要安裝.NET Runtime運(yùn)行時(shí),。

2. 以依賴于框架的方式發(fā)布應(yīng)用程序

生成一個(gè)僅包含應(yīng)用程序本身及其依賴項(xiàng)的應(yīng)用程序,。應(yīng)用程序的運(yùn)行環(huán)境必須單獨(dú)安裝.NET運(yùn)行時(shí)。

總結(jié)一句話:不包含.NET Runtime運(yùn)行時(shí),,只有應(yīng)用程序本身和依賴的應(yīng)用程序,。應(yīng)用程序運(yùn)行的主機(jī)需要單獨(dú)安裝應(yīng)用程序所需的.NET Runtime運(yùn)行時(shí)。

NET 5/.NET Core的應(yīng)用程序的發(fā)布指令:dotnet publish

dotnet publish -將應(yīng)用程序及其依賴項(xiàng)發(fā)布到指定的文件夾中,,以方便后續(xù)部署到目標(biāo)托管系統(tǒng),。

關(guān)于dotnet publish的使用說(shuō)明,可以參考以下鏈接:https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-publish?WT.mc_id=DT-MVP-5003918

dotnet publish [<PROJECT>|<SOLUTION>] [-c|--configuration <CONFIGURATION>] [-f|--framework <FRAMEWORK>] [--force] [--interactive] [--manifest <PATH_TO_MANIFEST_FILE>] [--no-build] [--no-dependencies] [--no-restore] [--nologo] [-o|--output <OUTPUT_DIRECTORY>] [-p:PublishReadyToRun=true] [-p:PublishSingleFile=true] [-p:PublishTrimmed=true] [-r|--runtime <RUNTIME_IDENTIFIER>] [--self-contained [true|false]] [--no-self-contained] [-v|--verbosity <LEVEL>] [--version-suffix <VERSION_SUFFIX>]dotnet publish -h|--help

dotnet publish 將編譯應(yīng)用程序,,讀取其在項(xiàng)目文件中指定的依賴項(xiàng),,然后將結(jié)果文件集發(fā)布到目錄中。輸出包括以下內(nèi)容

  • 具有dll擴(kuò)展名的程序集中的中間語(yǔ)言(IL)代碼,。
  • 一個(gè).deps.json文件,,其中包含項(xiàng)目的所有依賴項(xiàng)
  • 一個(gè).runtimeconfig.json文件,,它指定應(yīng)用程序期望的共享運(yùn)行時(shí),,以及該運(yùn)行時(shí)的其他配置選項(xiàng)(例如,垃圾收集類型),。
  • 應(yīng)用程序依賴的應(yīng)用程序,,從NuGet緩存目錄復(fù)制到輸出文件夾中。

從上述描述中,我們可以發(fā)現(xiàn),,通過(guò)dotnet publish指令,,我們可以編譯應(yīng)用程序,生成并輸出指定運(yùn)行環(huán)境的交付物,。

我們新建一個(gè).NET 5的Console應(yīng)用程序,同時(shí)引用Newtonsoft.Json Nuget包,。

快速搞懂.NET 5/.NET Core應(yīng)用程序的發(fā)布部署

Main函數(shù)的代碼:

using System;

namespace NET5PublishExample{    class Program    {        static void Main(string[] args)        {            var msg = Newtonsoft.Json.JsonConvert.SerializeObject('Hello .NET 5!');            Console.WriteLine(msg);            Console.ReadKey();        }    }}

首先,,編譯一下這個(gè)工程dotnet build,這一步很重要,。然后,,使用命令行執(zhí)行dotnet publish指令:

快速搞懂.NET 5/.NET Core應(yīng)用程序的發(fā)布部署

我們看一下F:\GitHub\Source\Repos\NET5PublishExample\bin\Debug\net5.0\publish\目錄下生成的文件:

快速搞懂.NET 5/.NET Core應(yīng)用程序的發(fā)布部署

正如上面所說(shuō),輸出包括以下內(nèi)容

  • 具有dll擴(kuò)展名的程序集中的中間語(yǔ)言(IL)代碼:NET5PublishExample.dll
  • 一個(gè).deps.json文件,,其中包含項(xiàng)目的所有依賴項(xiàng),。NET5PublishExample.deps.json
  • 一個(gè).runtimeconfig.json文件,它指定應(yīng)用程序期望的共享運(yùn)行時(shí),,以及該運(yùn)行時(shí)的其他配置選項(xiàng)(例如,,垃圾收集類型)。NET5PublishExample.runtimeconfig.json
  • 應(yīng)用程序依賴的應(yīng)用程序,,從NuGet緩存目錄復(fù)制到輸出文件夾中,。Newtonsoft.Json.dll

同時(shí),還生成了一個(gè)Windows平臺(tái)的可執(zhí)行文件:NET5PublishExample.exe,,雙擊可以執(zhí)行:

快速搞懂.NET 5/.NET Core應(yīng)用程序的發(fā)布部署

另外,,使用dotnet NET5PublishExample.dll,也可以直接執(zhí)行:

快速搞懂.NET 5/.NET Core應(yīng)用程序的發(fā)布部署

然后有幾個(gè)疑問(wèn):

  • NET5PublishExample.dll是不是可以跨平臺(tái)運(yùn)行,?
  • 在Linux,、MacOS平臺(tái)下有沒(méi)有對(duì)應(yīng)的可執(zhí)行文件?

帶著這2個(gè)問(wèn)題,,我們繼續(xù)往下研究,?

dotnet publish生成的可執(zhí)行文件和跨平臺(tái)二進(jìn)制文件

自包含的方式發(fā)布應(yīng)用程序,依賴于框架的方式發(fā)布應(yīng)用程序,。這兩種發(fā)布模式默認(rèn)情況下都會(huì)生成特定于平臺(tái)的可執(zhí)行文件和跨平臺(tái)二進(jìn)制文件,。

1. 可執(zhí)行文件

可執(zhí)行文件不是跨平臺(tái)的。它們特定于操作系統(tǒng)和CPU體系結(jié)構(gòu),。因?yàn)閃indows和linux下的可執(zhí)行文件的結(jié)構(gòu)和內(nèi)容是不同的,,所以可執(zhí)行文件是分操作系統(tǒng)的。

這里我們示例2個(gè)平臺(tái)的可執(zhí)行文件:

① windows-x64平臺(tái)

快速搞懂.NET 5/.NET Core應(yīng)用程序的發(fā)布部署

② Linux-x64平臺(tái)

使用的dotnet publish指令 dotnet publish -r linux-x64 --self-contained false

快速搞懂.NET 5/.NET Core應(yīng)用程序的發(fā)布部署

生成的可執(zhí)行文件:

快速搞懂.NET 5/.NET Core應(yīng)用程序的發(fā)布部署

2. 跨平臺(tái)的二進(jìn)制文件

將應(yīng)用程序發(fā)布為依賴于框架的dll文件形式時(shí),,就會(huì)創(chuàng)建跨平臺(tái)的二進(jìn)制文件,。該dll文件以項(xiàng)目命名。例如,,如果您有一個(gè)名為應(yīng)用程序NET5PublishExample,,文件名為NET5PublishExample.dll創(chuàng)建,。

以這種方式發(fā)布的應(yīng)用程序dotnet <filename.dll>可以通過(guò)命令運(yùn)行,可以在任何平臺(tái)上運(yùn)行,。

關(guān)于自包含的發(fā)布選項(xiàng)和示例

以自包含的方式發(fā)布應(yīng)用會(huì)生成特定于平臺(tái)的可執(zhí)行文件,。

輸出發(fā)布文件夾包含應(yīng)用程序的所有組件,包括.NET庫(kù)和目標(biāo)運(yùn)行時(shí),。該應(yīng)用程序與其他.NET應(yīng)用程序隔離,,并且不使用本地安裝的.NET運(yùn)行時(shí)。因此無(wú)需下載并安裝.NET 運(yùn)行時(shí),。

可執(zhí)行二進(jìn)制文件針對(duì)指定的目標(biāo)平臺(tái)生成,。例如,如果您有一個(gè)名為NET5PublishExample的應(yīng)用程序,,并且發(fā)布了Windows的自包含可執(zhí)行文件,,則會(huì)創(chuàng)建NET5PublishExample.exe文件。對(duì)于Linux或macOS發(fā)布,,將創(chuàng)建一個(gè)NET5PublishExample文件,。目標(biāo)平臺(tái)和體系結(jié)構(gòu)-r <RID>由dotnet publish命令的參數(shù)指定。有關(guān)RID的更多信息,,請(qǐng)參見(jiàn).NET RID目錄,。

如果應(yīng)用程序具有特定于平臺(tái)的依賴項(xiàng),例如包含特定于平臺(tái)的依賴項(xiàng)的NuGet程序包,,則這些依賴項(xiàng)將與應(yīng)用程序一起復(fù)制到publish文件夾中,。

這種模式的優(yōu)勢(shì)有哪些呢?

  1. 控制.NET版本:可以控制與應(yīng)用程序一起部署的.NET版本,。
  2. 指定運(yùn)行的平臺(tái):因?yàn)楸仨殲槊總€(gè)平臺(tái)發(fā)布應(yīng)用程序,,所以我們需要確定應(yīng)用程序?qū)⒃诤翁庍\(yùn)行。如果.NET引入了新平臺(tái),,則必須先發(fā)布針對(duì)該平臺(tái)的版本,,然后才能在該平臺(tái)上運(yùn)行您的應(yīng)用程序。

同時(shí)也帶來(lái)了以下問(wèn)題:

  1. 更大的部署內(nèi)容:應(yīng)用程序包括.NET運(yùn)行時(shí)和所有應(yīng)用程序依賴項(xiàng),,所以所需的下載大小和硬盤空間大于依賴于框架的版本,。
  2. 難以更新.NET版本.NET Runtime:(隨應(yīng)用程序分發(fā))只能通過(guò)發(fā)布新版本的應(yīng)用程序進(jìn)行升級(jí)。但是,,.NET將根據(jù)應(yīng)用程序運(yùn)行的計(jì)算機(jī)上框架庫(kù)的需要更新關(guān)鍵的安全補(bǔ)丁,。

例如:

示例1:發(fā)布一個(gè)獨(dú)立的應(yīng)用程序,創(chuàng)建macOS 64位可執(zhí)行文件,,同時(shí)包含了.NET 運(yùn)行時(shí)

dotnet publish -r osx-x64

生成的文件列表如下:包含macOS 64可執(zhí)行文件NET5PublishExample,,以及包含了對(duì)應(yīng)macOS 64平臺(tái)下的.NET 運(yùn)行時(shí)

快速搞懂.NET 5/.NET Core應(yīng)用程序的發(fā)布部署

示例2:發(fā)布一個(gè)獨(dú)立的應(yīng)用程序,創(chuàng)建Windows 64位可執(zhí)行文件,同時(shí)包含了.NET 運(yùn)行時(shí)

 dotnet publish -r win-x64

生成的文件列表如下:包含Windows 64可執(zhí)行文件NET5PublishExample.exe,,以及包含了對(duì)應(yīng)Windows 64平臺(tái)下的.NET 運(yùn)行時(shí)

快速搞懂.NET 5/.NET Core應(yīng)用程序的發(fā)布部署

關(guān)于依賴框架的發(fā)布選項(xiàng)和示例

發(fā)布為依賴框架的應(yīng)用程序是跨平臺(tái)的,,并且不包含.NET運(yùn)行時(shí)。應(yīng)用程序的運(yùn)行需要單獨(dú)安裝指定版本的.NET運(yùn)行時(shí),。

應(yīng)用程序的跨平臺(tái)二進(jìn)制文件可以使用dotnet <filename.dll>命令運(yùn)行,,并且可以在任何平臺(tái)上運(yùn)行。如果應(yīng)用程序使用具有特定于平臺(tái)的實(shí)現(xiàn)的NuGet包,,則所有平臺(tái)的依賴項(xiàng)都將與應(yīng)用程序一起復(fù)制到publish文件夾中,。

可以通過(guò)將-r <RID> --self-contained false參數(shù)傳遞給dotnet publish命令來(lái)為特定平臺(tái)創(chuàng)建可執(zhí)行文件。當(dāng)-r參數(shù)被省略,,為當(dāng)前平臺(tái)創(chuàng)建一個(gè)可執(zhí)行文件。具有目標(biāo)平臺(tái)特定于平臺(tái)的依賴關(guān)系的任何NuGet軟件包都將復(fù)制到publish文件夾中,。

這種模式帶來(lái)的優(yōu)勢(shì)有:

  1. 小型部署:僅分發(fā)應(yīng)用程序及其依賴項(xiàng),。.NET運(yùn)行時(shí)和庫(kù)由用戶安裝,所有應(yīng)用共享運(yùn)行時(shí),。
  2. 跨平臺(tái):應(yīng)用程序和任何基于.NET的庫(kù)都可以在其他操作系統(tǒng)上運(yùn)行
  3. 使用最新的.NET運(yùn)行時(shí):該應(yīng)用程序使用目標(biāo)系統(tǒng)上安裝的最新運(yùn)行時(shí),。這意味著應(yīng)用程序會(huì)自動(dòng)使用最新的.NET運(yùn)行時(shí)修補(bǔ)版本。

同時(shí)也帶來(lái)了以下問(wèn)題:

  1. 需要預(yù)安裝.NET 運(yùn)行時(shí):僅在主機(jī)系統(tǒng)上已安裝應(yīng)用目標(biāo)的.NET運(yùn)行時(shí)版本時(shí),,應(yīng)用才能運(yùn)行,。
  2. .NET可能會(huì)更改:.NET運(yùn)行時(shí)和庫(kù)可能會(huì)在運(yùn)行該應(yīng)用程序的計(jì)算機(jī)上更新。

例如:

示例1:發(fā)布一個(gè)當(dāng)前平臺(tái)的依賴框架的跨平臺(tái)應(yīng)用程序,,不包含.NET 運(yùn)行時(shí),,將與dll文件一起創(chuàng)建一個(gè)針對(duì)當(dāng)前平臺(tái)的可執(zhí)行文件。

dotnet publish

使用dotnet NET5PublishExample.dll,,可以直接運(yùn)行(本機(jī)已經(jīng)安裝.NET運(yùn)行時(shí),,NET5PublishExample.dll是跨平臺(tái)的二進(jìn)制文件

示例2:發(fā)布一個(gè)依賴框架的跨平臺(tái)應(yīng)用程序(Linux 64位),不包含.NET 運(yùn)行時(shí),,將創(chuàng)建一個(gè)Linux 64位可執(zhí)行文件以及dll文件,。

dotnet publish -r linux-x64 --self-contained false
快速搞懂.NET 5/.NET Core應(yīng)用程序的發(fā)布部署

使用dotnet NET5PublishExample.dll,可以直接運(yùn)行(本機(jī)已經(jīng)安裝.NET運(yùn)行時(shí),,NET5PublishExample.dll是跨平臺(tái)的二進(jìn)制文件

快速搞懂.NET 5/.NET Core應(yīng)用程序的發(fā)布部署

ReadyToRun編譯選項(xiàng)

通過(guò)將應(yīng)用程序程序集編譯為ReadyToRun(R2R)格式,,可以改善.NET應(yīng)用程序的啟動(dòng)時(shí)間和延遲。R2R是一種提前(AOT)編譯的形式,。

R2R二進(jìn)制文件通過(guò)減少應(yīng)用程序加載時(shí)即時(shí)(JIT)編譯器需要完成的工作量來(lái)提高啟動(dòng)性能,。與JIT產(chǎn)生的代碼相比,二進(jìn)制文件包含相似的本機(jī)代碼,。

但是,,R2R二進(jìn)制文件較大,因?yàn)樗鼈兗劝虚g語(yǔ)言(IL)代碼(某些情況下仍然需要此代碼)和同一代碼的本機(jī)版本。僅當(dāng)發(fā)布針對(duì)特定運(yùn)行時(shí)環(huán)境(RID)(例如Linux x64或Windows x64)的應(yīng)用程序時(shí),,R2R才可用,。

總結(jié)一下:通過(guò)R2R方式,可以直接將代碼編譯為Native Code,,減少.NET 程序第一次加載時(shí)JIT編譯帶來(lái)的性能消耗,,以提升.NET應(yīng)用的首次加載性能。類似于ngen的程序集預(yù)加載,。關(guān)于Ngen可以參考這個(gè)鏈接:ngen

對(duì)應(yīng)的dotnet publish指令選項(xiàng): dotnet publish -c Release -r win-x64 -p:PublishReadyToRun=true

以上是.NET 5/.NET Core應(yīng)用程序的發(fā)布部署的一些研究和分享,。

推薦一個(gè)不錯(cuò)的知識(shí)鏈接:https://docs.microsoft.com/en-us/dotnet/core/deploying/#publish-framework-dependent?WT.mc_id=DT-MVP-5003918

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多