.net core遷移實踐:項目文件csproj的轉換

隨着net core的不斷更新和生產可用,越來越多的人把現有的應用遷移和部署到net core平臺。本文將分享遷移過程中的一個環節,給大家做一下參考。

背景說明

先來介紹一下什麼是SDK樣式的文件結構。關注net core發展的同學應該對早期的項目定義文件project.json還有點印象。.net開發組在net core 1.0版本時是準備拋棄xml格式的csproj文件而改爲json格式的project.json來定義和描述項目的。但是後來主要由於MSBuild的兼容問題,不得不放棄project.json轉移回xml格式的csproj(詳見https://devblogs.microsoft.com/dotnet/announcing-net-core-tools-msbuild-alpha/)。

然而由於傳統.net framework的csproj文件內容繁雜,可讀性和操作性較差,因此微軟重新定義了新樣式的csproj文件內容樣式。其最大化的保持了和原有xml屬性的兼容,並添加了一些新的特性。由於新格式的csproj文件總是以:

<Project Sdk="Microsoft.NET.Sdk"></Project>

標記來定義,所以稱之爲SDK樣式。

一個典型的.net framework平臺的csproj文件結構如下圖所示:
image
其中包含了項目的編譯配置、調試生成配置、大量的nuget文件依賴、大量的cs源代碼文件路徑等,造成了此文件內容的非常繁多,閱讀和分析都有比較大的困難。

而SDK樣式的csproj文件內容就非常精簡了,如下圖所示:

image

其中TargetFrameworks配置項目的多目標平臺,可選的值有netstandard2.1;net451;netcoreapp3.1,三種格式分別代表net standard、net framework、net core目標平臺。此處的配置根據各人的項目定位不同設置所需的值。我們公司的業務程序是跑在特定的運行容器下的,遷移過程也是分階段展開,最終我們採取先同時編譯兩個目標平臺dll的方案。

由以上對比可見,SDK樣式的csproj內容精簡的一大原因就是文件的依賴(cs源碼和nuget包文件)不需要在csproj中明確寫明。針對cs源碼及目錄結構,VS自動識別項目目錄內的文件結構作爲項目結構,這一點改變真是點贊。因爲文件及目錄不需要csproj這個中間層再多一次描述,相當於“所見即所得”,相信大家在平時肯定遇到磁盤的源文件存在而VS項目就是看不到等類似問題,以後不會再有困惑啦。

另外針對nuget包依賴的文件也是如此,csproj不再維護nuget包內的文件明細,而改爲PackageReference以nuget包爲單位來管理依賴。這個改變對我們的轉換幾乎沒有影響,重新添加一次nuget引用即可;同時再說一句:net core是不支持packages.config文件管理nguet包,建議大家提前就將nuget包的管理改爲PackageReference方式;

csproj文件轉換的操作步驟

有了以上的背景說明,接下來的工作就是針對要遷移的項目csproj文件執行改造,其實微軟也提供了一些輔助工具(dotnet try-convert等)來幫助遷移,但是必須先保證遷移操作明確和無誤後,才能逐步使用特定的輔助工具來提高效率。具體操作如下:

1. 直接備份原csproj文件然後將其清空
2. 然後粘貼如下最小化的xml代碼:
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>netstandard2.1;net451</TargetFrameworks>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
  </ItemGroup>
</Project>
3. 調整的依賴nuget包和直接引用的程序集dll

這一步對nuget包有要求,需要其提供netstandard平臺的版本,如下圖:
image

如果是公司內部的nuget包就需要提前做好支持,而如果是依賴的第三方nguet包那就需要確認是否有net core支持了。不過當前net core已成趨勢,絕大多數流行的nuget包都能夠支持了。

4. 檢查和處理源代碼中不兼容的部分

由於從.net framework遷移到.net core確實存在部分代碼不兼容的地方,因此需要一一識別並尋找替代方案。微軟官方提供了不兼容說明,大家可以參考本文末尾的鏈接【從 .NET Framework 遷移到 .NET Core 的中斷性變更】。

這裏提供幾種常見的不兼容情況:

  1. CallContext不兼容:可以通過Asynclocal替換解決。
  2. 原System.ComponentModel.DataAnnotations不兼容:需要單獨安裝nuget包System.ComponentModel.Annotations即可解決。
  3. System.Runtime.Remoting不兼容:暫無替換方案
5. 刪除:Properties文件夾的AssemblyInfo.cs
6. 刪除:packages.config文件。
7. 提醒:調整CI配置

輸出目錄Debug/Release目錄內也分別生成了netstandard2.1和net451的2套程序集。因此假如應用了CI的話,相關設置也需要更新。

完成以上操作後,項目的結構就變成了下圖的樣子,這樣編譯通過後會生成針對特定目標平臺的程序集。

image

總結

本文首先介紹了SDK樣式的csproj文件的背景,並詳細介紹了從傳統.net framework項目轉換到net core項目的關鍵步驟。根據各企業的項目規模和應用場景的不同,還需要制訂合理的遷移計劃,配合嚴格的測試工作,這樣才能保證遷移工作的穩定推進,尤其要避免的是因遷移net core而帶來服務異常甚至是生產事故。

祝大家遷移順利!

參考資料

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章