.net 知新:【3】.net 5 專案結構說明和釋出部署

XSpringSun發表於2021-08-03

.net 5的專案目錄結構和.net framework有些明顯的變化,包括顯示結構和專案檔案,從這兩個方面看看有哪些變化。

專案目錄結構

就以上篇用的demo專案為例(【.net 知新:【2】 .Net Framework 、.Net 5、 .NET Standard的概念與區別】),先看看.net 5專案目錄結構。

.net5 專案和原來.net framework專案最大的不同在於引用和專案檔案,.net 5變成了依賴項,裡面清晰的區分了包、分析器、框架、專案等內容,這樣分門別類更方便我們查詢和管理引用。

.net framework的所有引用都顯示在一起,包括其它專案、nuget包、dll等等引用。但是他們最終都是用專案檔案來管理這些東西,所以我們再看看他們專案檔案的差異。

專案檔案

在兩個專案中都引用了nuget包 Newtonsoft.Json,新增了ClassLibraryTest專案引用,建了一個Class1.cs的類檔案。
在專案裡面找到專案檔案.csproj,開啟兩個檔案對比,左邊是.net 5右邊是.net framework 4.6.1。

相對於.net framewokr而言,.net 5專案檔案會少很多內容:
在.net framework中所有引用類庫都包含在專案檔案中,.net 5是包含在框架中。
在.net framework中所有包含檔案描述都在專案檔案中,.net 沒有任何專案包含檔案的描述。

所以.net 5的專案檔案描述資訊在哪兒呢,現在我在專案中排除類檔案Class1.cs。

再開啟兩個專案檔案對比,摺疊起其他項。

在.net 5中排除項用<Compile Remove="Class1.cs" />" 在編譯的時候移除Class1.cs。
在.net framework中因為是包含了所有的專案檔案,所以排除就將<Compile Include="Class1.cs" />移除就行了。

.net 5中的這個小的改動會讓我們的專案檔案大大減少,試想如果我們的檔案成千上萬個那麼.csproj的大小和閱讀.net 5就會是巨大優勢。
.net 5中預設是包含所有檔案,如果要排除某檔案直接去除包含項就行了,但是作為一個正常專案不會有太多的排除而是大量的包含,所以.net 5的改動優化相當精妙。
.net 5可以直接雙擊專案就能在vs中開啟.csproj,.net framework需要到目錄中去開啟。

專案釋出

可在兩種模式下發布使用 .NET 建立的應用程式,模式會影響使用者執行應用的方式。
將應用作為獨立應用,生成的應用程式將包含 .NET 執行時和庫,以及該應用程式及其依賴項。 應用程式的使用者可以在未安裝 .NET 執行時的計算機上執行該應用程式。
如果將應用釋出為依賴於框架的應用,生成的應用程式將僅包含該應用程式本身及其依賴項。 應用程式的使用者必須單獨安裝 .NET 執行時。
預設情況下,這兩種釋出模式都會生成特定於平臺的可執行檔案。 不使用可執行檔案也可以建立依賴於框架的應用程式,這些應用程式是跨平臺的。

首先我們專案右鍵釋出,選擇資料夾方式釋出,然後就生成了釋出配置。

點選編輯或者設定可以進行釋出項配置。如上面官方文件描述,有【獨立】和【依賴框架】兩種方式。
如果釋出【依賴框架】那麼執行環境需要安裝.net 執行時,並且在釋出配置“目標執行時”可以選擇“可移植”,因為執行時是自主安裝不需要包含,所以不需要釋出指定的執行時。

如果選擇【獨立】那麼“目標執行時”只能選擇特定的。因為包含了.net執行時和庫,所以需要進行選擇。如果不選擇特定平臺,這樣就沒辦法將.net執行時和庫正確的釋出。

釋出專案,然後到釋出目錄看下兩種方式的檔案區別

  • 依賴框架->可移植

  • 獨立->win-x64(太長了擷取一部分)

以上就是釋出的簡單介紹,採用獨立的方式釋出時間會久一點,另外在釋出配置裡面還有個“檔案釋出選項”,有幾個配置簡單說明下,有興趣的可以對比下發布的檔案區別。

  1. 生成單個檔案:這個就是字面意思,通過將所有依賴應用程式的檔案捆綁到一個二進位制檔案中,這種方式適用於將專案用作第三方庫或者應用程式,方便傳輸管理。
  2. 啟用ReadyToRun編譯:可以通過將應用程式集編譯為 ReadyToRun (R2R) 格式來改進 .NET Core 應用程式的啟動時間和延遲。R2R 二進位制檔案通過減少應用程式載入時實時 (JIT) 編譯器需要執行的工作量來改進啟動效能。
  3. 裁剪未使用的程式集:也是字面意思,目前還是預覽版,無法可靠地分析各種有問題的程式碼模式(主要集中在反射使用),應用程式的生成時間分析可能會導致執行時失敗。這個功能最有用的應該是獨立釋出的方式,通過裁剪以減小部署大小。

相關文章