.NET Core應用的三種部署方式
- 2019 年 10 月 3 日
- 筆記
.NET Core應用提供了三種部署方式:
FDD
除非特殊說明,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 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 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