.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
-
-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
Target frameworks
Cross-platform targeting
Developing Libraries with Cross Platform T