ASP.NET Core 2.2 基礎知識(十八) 託管和部署 概述
為了方便演示,以 .NET Core 控制檯應用程式講解.
我們新建一個控制檯應用程式,安裝 "Newtonsoft.Json" Nuget 包,然後右鍵點選該專案,選擇"釋出":
我們依次選擇"檔案",設定好路徑,最後點選建立配置檔案,介面變成了下面這樣:
然後我們點選"配置"
那麼,問題來了."部署模式" 裡面有兩個選項:
1.當選擇框架依賴時,"目標執行時"有:"可移植","win-x86","win-x64","osx-64","linux-x64" 5個選項.
2.當選擇"獨立"時,"目標執行時"沒有"可移植"這個選項.
我們到底應該怎麼選擇?
不要做思想的巨人,行動的矮子!
沒事兒走兩步!
依賴框架的部署 (FDD) : "框架依賴" + "可移植"
以這種方法釋出後,進入釋出的資料夾發現,居然只有5個檔案 !
1個應用程式的程式集,1個pdb,2個json,1個第三方依賴項.
咦?怎麼沒有.EXE 檔案?沒有 .exe 檔案,我怎麼執行該專案?(其實,進入到該專案的debug資料夾,你會發現也沒有.exe檔案)
這樣執行:(為了方便,我通過 VS Code 進入該資料夾)
現在,我們回過頭來看官方對這種方式的解釋:
依賴框架的部署 (FDD) :
dotnet app.dll
就可以執行一個名為 app
的應用程式.
結合我們的實際操作,大概就是這幾個意思:
1.FDD 只會部署應用程式和第三方依賴項,也就是釋出生成的這4個檔案: MyConsole.dll ,MyConsole.pdb , 應用程式配置檔案 MyConsole.deps.json,以及第三方依賴項 Newtonsoft.json.dll .
2.名字既然叫"依賴框架",那依賴的系統肯定必須要有框架才行!也就是說,應用程式將要部署到的目標系統上,必須要有 .NET Core ;
3.應用程式將使用目標系統上存在的 .NET Core 版本.這就是最後一個檔案的意義.我們用記事本開啟 MyConsole.runtimeconfig.json ,可以看出,該檔案指明瞭我們需要依賴的.Net Core 的版本: "2.2.0"
{ "runtimeOptions": { "tfm": "netcoreapp2.2", "framework": { "name": "Microsoft.NETCore.App", "version": "2.2.0" } } }
FDD 也是 .NET Core 和 ASP.NET Core 應用程式的預設部署模型.該部署方式的優缺點如下:
優點:
-
不需要提前定義 .NET Core 應用將在其上執行的目標作業系統。 因為無論什麼作業系統,.NET Core 的可執行檔案和庫都是用通用的 PE 檔案格式,因此,無論什麼基礎作業系統,.NET Core 都可執行應用。
-
部署包很小。 只需部署應用及其依賴項,而無需部署 .NET Core 本身。
-
除非重寫,否則 FDD 將使用目標系統上安裝的最新服務執行時。 這允許應用程式使用 .NET Core 執行時的最新修補版本。
-
許多應用都可使用相同的 .NET Core 安裝,從而降低了主機系統上磁碟空間和記憶體使用量。
缺點:
-
只有目標系統上安裝的 .NET Core 版本不低於應用程式要求的版本時,應用才能執行。
-
如果不瞭解將來版本,.NET Core 執行時和庫可能發生更改。 在極少數情況下,這可能會更改應用的行為。
官方的這個優缺點已經說得很詳細了.其中,我對標紅的這句缺點實驗了一下,結果分享給大家:
首先,我們將 MyConsole.runtimeconfig.json 檔案中的版本號修改成 "2.3.0":
{ "runtimeOptions": { "tfm": "netcoreapp2.2", "framework": { "name": "Microsoft.NETCore.App", "version": "2.3.0" } } }
接著,我們在命令列中輸入 dotnet myconsole.dll 執行該專案:
執行失敗!
錯誤資訊大概意思如下:
第1句:沒有找到任何可以相容的 framework 版本.
第2句:沒有找到指定的 2.3.0 版本的 framework "Microsoft .NETCore.App" .
最後一句:(該系統)只安裝了 2.2.0 版本.
現在 ,我們將版本號修改成 2.1.0 試試看:
{ "runtimeOptions": { "tfm": "netcoreapp2.2", "framework": { "name": "Microsoft.NETCore.App", "version": "2.1.0" } } }
正常運行了:
又 12點 了.睡了.明天繼續