1. 程式人生 > >.NET Core應用的三種部署方式

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

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

FDD

FDD:Framework-dependent deployment,框架依賴部署。這種方式針對某個特定版本的.NET Core進行釋出,只打包應用本身及.NET Core類庫之外的第三方依賴項,需要目標系統上已安裝相應的.NET Core執行時。使用dotnet publish命令時,FDD是.NET Core 2.x的預設釋出方式。

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

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>

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

  • --self-contained false

    該引數值為false時,.NET Core SDK會以FDE模式打包應用

SCD

SCD:Self-contained deployment,自包含部署。這種方式會將.NET Core執行時及.NET Core類庫隨應用一起打包,產生的檔案數較多,佔用磁碟空間較大,但無需目標系統安裝.NET Core執行時。從.NET Core 2.0開始可以使用NET Core globalization invariant mode

來減少磁碟空間的佔用。

使用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 ModeSDK VersionCommand
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 basics和How 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 T