NuGet已整合到MSBuild中
對於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(轉載)
相關文章
- 整合到物聯網中
- NuGet是什麼?為什麼.NET專案中會有NuGet?如何使用NuGet程式包?
- Msbuild利用cpu多核加速UI
- MSBuild釋出網站UI網站
- MSBuild Tools解決辦法UI
- 修改VS中的NuGet包下載路徑
- 分析nuget原始碼,用nuget + nuget.server實現winform程式的自動更新原始碼ServerORM
- 【譯】新的 MSBuild 編輯體驗UI
- 將測試人員整合到敏捷團隊中敏捷
- GRPC融合到aps.netcore 中RPCNetCore
- 將.Net AI外掛整合到自己的程式中AI
- nuget包管理:製作、釋出包到nuget伺服器、從nuget伺服器刪除包伺服器
- NuGet.Tools.dl
- koo視訊播放器整合到flutter專案中播放器Flutter
- Ladda – 把載入提示效果整合到按鈕中
- Activiti配置整合到nacos
- 使用 nuget server 的 API 來實現搜尋安裝 nuget 包ServerAPI
- 將FRAM儲存器晶片整合到汽車EDR設計中晶片
- 【PayPal】PayPal表示將把Venmo整合到其加密系統中加密
- StreamNative將Kafka整合到基於Apache Pulsar的雲中KafkaApache
- 建立NuGet本地包源
- nuget packages batch installPackageBAT
- GitLab 管理 NuGet 包Gitlab
- nuget離線安裝
- Tableau 等常見 BI 工具能整合到 java 專案中嗎Java
- Presto整合到Ambari介紹REST
- babun安裝,整合到cmder
- NuGet私有伺服器ProGet Docker搭建和公司中實戰用法伺服器Docker
- 持續整合配置之Nuget
- 釋出nuget包的正確姿勢---cicd自動打包釋出nuget包
- Windows中的Gitlab Runner使用:.gitlab-ci.yml中MsBuild.exe的路徑和.csproj檔案路徑WindowsGitlabUI
- RN學習(四)——RN專案整合到現有iOS專案中iOS
- 使用Falcosidekick將執行時安全整合到現有環境中IDE
- 專案問題總結1:Nuget無法安裝程式包dll,提示:此程式包已安裝
- React Native在Android當中實踐(三)——整合到Android專案當中React NativeAndroid
- JMeter原始碼整合到EclipseJMeter原始碼Eclipse
- MSBuild + MSILInect實現編譯時AOP之預覽UI編譯
- nuget 包是如何還原的