對于C#和VB項目文件,Microsoft在嘗試推出基于JSON的項目格式后,又回歸到以MSBuild為基礎。在推出此決策的同時,Microsoft承諾會實現一些十分類似于project.json的特性。今天我們將探討其中的一個特性:NuGet集成。
一直以來,NuGet都是一個附加(bolt-on)在Visual Studio中的特性。但是編譯器雖然可以觸發NuGet軟件包的下載,卻無法理解這些軟件包。因此當一個軟件包完成下載后,需要被安裝到項目之中,其中可能包括更新裝配引用(Assembly Reference)、拷貝文件或是運行定制的PowerShell腳本。這一做法是非常脆弱的,開發人員時常需要在重新安裝軟件包前手工清理項目文件。
隨著PackageReference這一新特性的提出,很多類似的問題將不再出現。現在開發人員不再是引用個別的裝配,而是可以引用軟件包本身。
包引用現在是可傳遞的。這意味著你僅需引用一個軟件包即可,不再需要顯式地引用該軟件包所需的各個軟件包。按新聞發布稿中的說法,這可提升安裝或更新軟件包的性能達五倍。在一個例子中,一個10分鐘的過程降低到了30毫秒。
NuGet集成特性取消了解決方案層面的包文件夾,依賴將直接引用用戶的“Package Cache”目錄。要解釋為什么Microsoft以前不這樣,讓我們重新回顧一下以前版本NuGet的“附加性”本質。鑒于編譯器不能理解NuGet軟件包,因此需要在項目文件中正確設置一個“路徑線索”。由于每個用戶可以設置自身的“Package Cache”目錄,因此不能使用這樣的文件夾,需要創立解決方案層面的包文件夾,以確保相對的路徑線索對于所有的開發人員都是一樣的。
版本控制
對NuGet項目引用的版本控制支持得到了很大的改進。現在可以使用范圍和通配符指定想要使用的軟件包版本信息。范圍定義采用了數學中的通用語法:
不低于x.y版本:[x.y; 高于x.y版本:(x.y; 不高于x.y版本:x.y]; 低于x.y版本:x.y)。舉個例子,如果你需要版本不低于1.4.2同時不高于1.5,可以使用“[1.4.2, 1.5)”。反之,如果你想要1.4版本家族中的所有版本,可以使用“1.4.*”。
現在可以使用IncludeAssets和ExcludeAssets標簽控制內容。它們已被包括在構建過程中,用于修改斷言的類型(分析器、內容文件等)。你甚至可以將斷言標記為私有的,這意味著其所標記的斷言是用于開發目的,不應該留給下游的軟件庫。
使用MSBuild創建NuGet軟件包
雖然在MSBuild中總是可以使用Exec命令加載NuGet的package命令,并傳入到規格文件中,但是在持續集成環境中最好不要這樣使用。因此這次發布版本實現了MSBuild直接打包項目,甚至適用于使用TargetFrameworks標簽定義了多個目標架構的項目。
談及這個問題,可能存在對不同的目標平臺應引用不同的軟件包這一需求。你可以使用PackageReference定義一個標準的MSBuild條件表達式,以表示引用的適用場景。
向后兼容問題
對NuGet集成特性的一個主要擔心是缺乏對一些舊版本NuGet特性的支持,例如內容文件夾(Content Folder)、XML文檔轉換(XDT),還有PowerShell腳本install.ps1和uninstall.ps1。
當前這些NuGet特性對于.NET Core和.NET標準項目是可用的。如果安裝了VS 2017 Update 1預覽版,其它類型的項目也可以使用NuGet集成特性。
查看英文原文:NuGet is Now Part of MSBuild