前一段時間,我寫了一篇關(guān)于遷移csproj格式的博客,將WPF、UWP和其他類型的舊csproj遷移到基于微軟的新csproj中。NET.Sdk,但是整個過程都是手工進行的,最后處理XAML問題還是很頭疼的。
現(xiàn)在,我們可以使用工具自動完成這個過程。當然,該工具不遷移csproj格式,而是在不遷移格式的情況下使用PackageReference模式NuGet引用。
本文內(nèi)容
自動升級檢查升級后的兼容性問題 install.ps1 腳本將失效 使用 content 方式指定的內(nèi)容資產(chǎn)將失效 XDT 變換將失效 lib 根目錄中的程序集將被忽略解決升級后的編譯錯誤 參考資料 自動升級下載并安裝Visual Studio插件NuGet包參考升級程序。安裝完成后,再次啟動Visual Studio,即可開始遷移。
更新:遷移工具從Visual Studio 2017的15.7版開始帶入Visual Studio。有關(guān)詳細信息,請參見:從package.config遷移到包參考格式-微軟文檔。
只有一個步驟:右鍵單擊packages.config文件并選擇升級到PackageReference。
在彈出的界面中,選擇包版本,確認完成項目的遷移。
與之前編寫的手動遷移相比,自動遷移模式并沒有改變csproj的格式,只是將NuGet的引用模式改為PackageReference。要了解具體的好處,您可以閱讀關(guān)于將WPF、UWP和其他類型的舊csproj遷移到基于Microsoft.NET.Sdk的新csproj
升級后檢查兼容性問題
packages.config的NuGet包的管理模式有一些PackageReference沒有的功能。當然,這些功能不可用,是因為“不需要”,而不是“還不支持”;因此,大部分遷移都不會成為問題(除非發(fā)布包使用了特別老的nuget.exe,或者發(fā)布者使用了一些瘋狂的黑技術(shù))。
在15.7版以上的Visual Studio 2017遷移工具中,會自動列出可能存在的兼容性問題。
install.ps1腳本將無效
使用PackageReference,install.ps1腳本將不再在安裝和寫入過程中執(zhí)行。如果某些行為依賴于此腳本,則此NuGet包的行為可能不正常。
不過不用擔(dān)心!install.ps1的存在是因為packages.config不支持PackageReference中的一些新特性(比如NuGet包中的新目錄結(jié)構(gòu),比如包中的msbuild目標)。因此,如果NuGet包在發(fā)布時滿足目錄要求,即使不需要執(zhí)行install.ps1,也能保證包的正常行為。
使用Content方法指定的內(nèi)容資產(chǎn)將無效
PackageReference使用內(nèi)容文件來管理內(nèi)容資產(chǎn),這些內(nèi)容資產(chǎn)可以在多個依賴包之間更好地傳輸和共享。之前內(nèi)容指定的資產(chǎn)將無效。
建議檢查所有相關(guān)的NuGet包。如果您有權(quán)限修改某些依賴包,請使用內(nèi)容文件而不是內(nèi)容。
XDT轉(zhuǎn)型將會失敗
使用PackageReference,在安裝和寫入期間不會執(zhí)行XDT轉(zhuǎn)換。xdt文件將被忽略。
Web應(yīng)用開發(fā)中要多注意這個問題。
lib根目錄中的程序集將被忽略
lib文件夾中的程序集根據(jù)目標框架應(yīng)該是子文件夾,比如net45、netstandard2.0、netcoreapp2.0,PackageReference要求只能引用某個目標框架下的程序集。
如果默認創(chuàng)建NuGet包,基本不會遇到這樣的問題。除非您在創(chuàng)建NuGet包時有自定義操作,否則請將程序集放在根目錄中。
升級后解決編譯錯誤
最有可能的編譯問題是NuGet包引用的版本沖突。
packages.config模式中的包引用需要在csproj文件中顯式指定依賴包的版本,因此無論哪個版本用于依賴,最終都是由顯式指定的版本指定的。
PackageReference的引用模式是自動管理依賴版本。只要每個包都在允許的版本范圍內(nèi),版本就會被自動選擇并顯示在解決方案的引用中。
PackageReference依賴項沖突提示通常如下:
檢測到版本沖突。請直接從項目中引用包來解決此問題。
NuGet。包裝3 . 5 . 0->;NuGet。版本控制(= 3.5.0)
NuGet。配置4 . 0 . 0->;NuGet。版本控制(= 4.0.0)
也就是說,被引用的兩個不同的包需要同一個包的不同版本,所以PackageReference不能隱式推斷依賴包的版本。這時候就需要把項目的依賴模式改成之前的依賴模式。
當然,在制作和發(fā)布NuGet包時,要盡量使用非特定版本的依賴包,這樣可以大大避免這個問題的影響。您可以閱讀版本范圍和通配符版本范圍和通配符,了解如何指定沒有特定版本的依賴包。
參考數(shù)據(jù)
Migrating from package.config to PackageReference formats - Microsoft Docspackages.config (PC) to PackageReference (PR) Migrator · NuGet/Home Wiki原地址:https://Walter LV . com/post/migrate-packages-config-to-package-reference . html
1.《完成packages 自動將 NuGet 包的引用方式從 packages.config 升級為 PackageReference》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識,僅代表作者本人觀點,與本網(wǎng)站無關(guān),侵刪請聯(lián)系頁腳下方聯(lián)系方式。
2.《完成packages 自動將 NuGet 包的引用方式從 packages.config 升級為 PackageReference》僅供讀者參考,本網(wǎng)站未對該內(nèi)容進行證實,對其原創(chuàng)性、真實性、完整性、及時性不作任何保證。
3.文章轉(zhuǎn)載時請保留本站內(nèi)容來源地址,http://f99ss.com/jiaoyu/787947.html