NuGet已整合到MSBuild中

boxti發表於2017-07-05

對於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整合特性。

本文轉自d1net(轉載)


相關文章