.NET Core應用提供了三種部署方式:git
github
除非特殊說明,FDD會使用目標系統上指定.NET Core版本的最新可用.NET Core runtime。json
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: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 basics和How to specify target frameworks
執行命令:dotnet publish -o pub -c Release
能夠看到文件夾中只有4個文件,佔用8K磁盤空間:
pub
│ app.deps.json
│ app.dll
| app.pdb
| app.runtimeconfig.json
執行命令: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
執行命令: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