自动将 NuGet 包的引用方式从 packages.config 升级为 PackageReference
在前段時間我寫了一篇遷移 csproj 格式的博客?將 WPF、UWP 以及其他各種類型的舊 csproj 遷移成基于 Microsoft.NET.Sdk 的新 csproj,不過全過程是手工進行的,而且到最后處理 XAML 問題也非常頭疼。
現在,我們可以利用工具自動地完成這個過程。當然,工具并不將 csproj 格式進行遷移,而是在不遷移格式的情況下,使用到?PackageReference?方式 NuGet 引用帶來的好處。
本文內容
自動升級
檢查升級后的兼容性問題
install.ps1 腳本將失效
使用 content 方式指定的內容資產將失效
XDT 變換將失效
lib 根目錄中的程序集將被忽略
解決升級后的編譯錯誤
參考資料
自動升級
下載安裝 Visual Studio 插件?NuGet PackageReference Upgrader。在安裝完成之后,再次啟動 Visual Studio,則可以開始遷移。
更新:自 Visual Studio 2017 的 15.7 版本開始,遷移工具已經自帶到 Visual Studio 中。詳情請參見:Migrating from package.config to PackageReference formats - Microsoft Docs。
只有一個步驟:在?packages.config?文件上點擊右鍵,選擇?Upgrade to PackageReference。
在彈出的界面中,選擇包的版本,確定即可完成一個項目的遷移。
相比于之前寫的手工遷移,自動遷移方式沒有改變 csproj 的格式,而只是將 NuGet 的引用方式改成了?PackageReference。具體有哪些好處,可以閱讀?將 WPF、UWP 以及其他各種類型的舊 csproj 遷移成基于 Microsoft.NET.Sdk 的新 csproj。
檢查升級后的兼容性問題
packages.config?的 NuGet 包的管理方式有些功能是?PackageReference?沒有的。當然,沒有這些功能是因為“不需要”,而不是“還沒支持”;所以大部分的遷移都不會發生問題(除非發布包使用的是特別老舊的 nuget.exe,或者發布者利用了一些喪心病狂的黑科技)。
在 Visual Studio 2017 的 15.7 版本以上自帶的遷移工具中,會自動列出可能的兼容性問題。
install.ps1 腳本將失效
使用?PackageReference?后,在安裝和寫在的過程中?install.ps1?腳本將不再執行。如果有一些行為依賴于此腳本,那么這個 NuGet 包的行為可能不正常。
但是,不用擔心!install.ps1?的存在是因為?packages.config?不支持?PackageReference?中的一些新特性(例如 NuGet 包中新的目錄結構,例如包中自帶的 msbuild targets)。所以,如果 NuGet 包在發布時滿足目錄要求,那么即便?install.ps1?不用執行也能保證包的行為正常。
使用 content 方式指定的內容資產將失效
PackageReference?使用?contentFiles?來管理內容資產,這樣可以更好地在多個依賴包之間傳遞和共享。而此前?content?指定的資產將失效。
建議檢查所有依賴的 NuGet 包,如果你有權限修改部分依賴包,那么請使用?contentFiles?來替代?content。
XDT 變換將失效
使用?PackageReference?后,在安裝和寫在的過程中 XDT 轉換將不會執行,并且會忽略 .xdt 文件。
在 Web 應用開發中會更留意這個問題。
lib 根目錄中的程序集將被忽略
lib 文件夾內的程序集都應該按照目標框架建立子文件夾,例如 net45、netstandard2.0、netcoreapp2.0。PackageReference?要求只能引用在某個目標框架下的程序集。
如果是使用默認的方式創建的 NuGet 包,基本上不會遇到這樣的問題。除非你在創建 NuGet 包時有自定義操作在根目錄放了程序集。
解決升級后的編譯錯誤
最可能出現的編譯問題是 NuGet 包引用的版本沖突。
packages.config?方式的包引用要求在 csproj 文件中顯式指定一個依賴的包的版本,于是無論依賴使用了哪個版本,最終都由顯式指定的版本來指定。
而?PackageReference?的引用方式是自動管理依賴版本的,只要每個包都在允許的版本范圍之內,就自動選擇版本,并顯示在解決方案的引用中。
PackageReference?出現依賴沖突的提示通常是這樣的:
Version conflict detected for NuGet.Versioning. Reference the package directly from the project to resolve this issue.NuGet.Packaging 3.5.0 -> NuGet.Versioning (= 3.5.0)
NuGet.Configuration 4.0.0 -> NuGet.Versioning (= 4.0.0)
也就是說,引用的兩個不同的包要求依賴相同包的不同版本,于是?PackageReference?無法隱式推斷依賴包的版本。這時需要將項目的依賴方式改為之前的方式。
當然,在制作和發布 NuGet 包時,盡量使用非特定版本的依賴包,能夠極大地避免這種問題帶來的影響。關于如何指定非特定版本的依賴包,可以閱讀?Version ranges and wildcards 版本范圍和通配符。
參考資料
Migrating from package.config to PackageReference formats - Microsoft Docs
packages.config (PC) to PackageReference (PR) Migrator · NuGet/Home Wiki
原文地址:https://walterlv.com/post/migrate-packages-config-to-package-reference.html
.NET社區新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com
總結
以上是生活随笔為你收集整理的自动将 NuGet 包的引用方式从 packages.config 升级为 PackageReference的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Docker最全教程之使用TeamCit
- 下一篇: 开发语言大爆炸的时代,究竟谁主沉浮?