日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

自动将 NuGet 包的引用方式从 packages.config 升级为 PackageReference

發布時間:2023/12/4 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 自动将 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。