.NET Core應用的三種部署方式

.NET Core應用提供了三種部署方式:git

FDD

FDD:Framework-dependent deployment,框架依賴部署。這種方式針對某個特定版本的.NET Core進行發佈,只打包應用自己及.NET Core類庫以外的第三方依賴項,須要目標系統上已安裝相應的.NET Core運行時。使用dotnet publish命令時,FDD是.NET Core 2.x的默認發佈方式。github

除非特殊說明,FDD會使用目標系統上指定.NET Core版本的最新可用.NET Core runtime。json

FDE

FDE:Framework-dependent executables,框架依賴可執行程序。這種方式針對某個特定版本的.NET Core及特定平臺進行發佈,只打包應用自己及.NET Core類庫以外的第三方依賴項,須要目標系統上已安裝相應的.NET Core運行時。FED適用於.NET Core 2.2及以上版本,是.NET Core 3.x的默認發佈方式。使用dotnet publish命令(除.NET Core 3.x以外)以PDE模式發佈應用,需指定下面兩個參數:網絡

  • -r <RID>app

    該參數使用RID用於指定目標平臺框架

  • --self-contained false工具

    該參數值爲false時,.NET Core SDK會以FDE模式打包應用ui

SCD

SCD:Self-contained deployment,自包含部署。這種方式會將.NET Core運行時及.NET Core類庫隨應用一塊兒打包,產生的文件數較多,佔用磁盤空間較大,但無需目標系統安裝.NET Core運行時。從.NET Core 2.0開始可使用NET Core globalization invariant mode來減小磁盤空間的佔用。spa

使用dotnet publish命令(除.NET Core 3.x以外)以PDE模式發佈應用,需指定下面兩個參數:翻譯

  • -r <RID>

    該參數使用RID用於指定目標平臺

  • --self-contained true

    該參數值爲true時,.NET Core SDK會以SCD模式打包應用

從.NET Core 2.1 SDK(2.1.300)開始,.NET Core支持patch version roll forward(翻譯爲補丁前滾?)在使用該模式進行打包時,.NET Core工具會自動選擇指定.NET Core版本的最新可用.NET Core runtime。若是用於構建的機器上未安裝指定.NET Core版本的最新.NET Core runtime,.NET Core工具會從NuGet.org上自行下載。因此,使用該模式進行打包可能會依賴網絡。有關patch version roll forward,可參考: Self-contained deployment runtime roll forward

命令示例

Publish Mode SDK Version Command
Framework-dependent deployment 2.x dotnet publish -c Release
Framework-dependent executable 2.2 dotnet publish -c Release -r <RID> --self-contained false
  3.0 dotnet publish -c Release -r <RID> --self-contained false
  3.0* dotnet publish -c Release
Self-contained deployment 2.1 dotnet publish -c Release -r <RID> --self-contained true
  2.2 dotnet publish -c Release -r <RID> --self-contained true
  3.0 dotnet publish -c Release -r <RID> --self-contained true

 

可使用dotnet publish --help命令來查看幫助文檔:

示例

建立控制檯應用(這裏使用.NET Core 2.2):dotnet new console

能夠在項目文件(.csoroj)中看到使用dotnet publish發佈應用時默認使用的目標框架:

能夠將目標框架更改成任意被支持的Target Framework Moniker (TFM)。針對多個目標框架的發佈,可參考:Publishing basicsHow to specify target frameworks

FDD

執行命令:dotnet publish -o pub -c Release

能夠看到文件夾中只有4個文件,佔用8K磁盤空間:

pub
│   app.deps.json
│   app.dll    
|   app.pdb
|   app.runtimeconfig.json

FDE

執行命令:dotnet publish -o pub -c Release -r win-x64 --self-contained false

能夠看到,相比FDD,文件夾中多了exe文件,共佔用140K磁盤空間:

pub
│   app.deps.json
│   app.dll    
|   app.exe
|   app.pdb
|   app.runtimeconfig.json

SCD

執行命令:dotnet publish -o pub -c Release -r win-x64 --self-contained true

文件夾中有217個文件,佔用65.8M空間。

 

小結

FDD與FDE相似:只打包應用自己及.NET Core類庫以外的第三方依賴項,都須要目標系統中已安裝相應版本的運行時。但有如下不一樣:

  • FDE會生產可執行文件(如,Windows下的exe),可直接運行程序,FDD打包後則須要藉助dotnet utility來啓動,如:dotnet app.dll

  • 由於不一樣的系統的可執行程序格式不一樣,因此針對Windows系統以FDE模式打包應用沒法直接放到Linux中運行。FDD只生成依賴特定運行時的程序集,只要目標系統中安裝了相應的運行時,均可以運行打包後的程序,與系統無關。

相比於FDD和FDE,SCD將應用、.NET Core運行時、.NET Core類庫、第三方依賴均打包在一塊兒,會產生一個比較大的包。由於自身已經包含了運行時,能夠直接放到支持.NET Core的系統中運行,不管目標系統中是否已安裝.NET Core運行時。SCD打包的應用自成一體,互相隔離、互不影響。

FDE與SCD在打包時都會生產針對特定平臺的可執行文件。因此,在使用dotnet publish命令時,須要指定-r <RID>參數。這裏可執行文件的做用與dotnet命令相似,是啓動.NET Core應用的HOST,在Windows中,可執行程序名稱一般爲:<PROJECT-FILE>.exe,.NET Core應用名爲<PROJECT-FILE>.dll。

推薦閱讀

.NET Core application deployment

Publish .NET Core apps with the CLI

Target frameworks

Cross-platform targeting

Developing Libraries with Cross Platform Tools

相關文章
相關標籤/搜索