Dot-Net

NuGet 自動包還原不適用於 MSBuild

  • March 10, 2014

我正在嘗試使用 MSBuild 12.0建構一個packages缺少內容(內部除外)的解決方案。repositories.config我希望它在建構之前自動恢復所有失去的包,但事實並非如此——MsBuild 報告了大量錯誤:

“您是否缺少 using 指令或程序集引用?”

NuGet Manager 是 2.7(我在 Visual Studio 2013 中看到了這個關於框)。我什至試圖傳遞EnableNuGetPackageRestore=true參數 - 沒有運氣。我錯過了什麼?

使用最新的官方 NuGet 文件更新 v3.3.0

包恢復方法

NuGet 提供了三種使用包還原的方法。


**自動包還原**是 NuGet 團隊推薦的在 Visual Studio 中進行包還原的方法,它是在 NuGet 2.7 中引入的。從 NuGet 2.7 開始,NuGet Visual Studio 擴展集成到 Visual Studio 的生成事件中,並在生成開始時恢復失去的包。預設情況下啟用此功能,但如果需要,開發人員可以選擇退出。


以下是它的工作原理:

  1. 在項目或解決方案生成時,Visual Studio 會引發在解決方案中開始生成的事件。
  2. NuGet 響應此事件並檢查解決方案中包含的 packages.config 文件。
  3. 對於找到的每個 packages.config 文件,都會枚舉其包並檢查解決方案的封包件夾中是否存在。
  4. 任何失去的包都從使用者配置(和啟用)的包源下載,尊重包源的順序。
  5. 下載包後,會將它們解壓縮到解決方案的封包件夾中。

如果您安裝了 Nuget 2.7+;選擇一種方法來管理 Visual Studio 中的自動包還原非常重要。

有兩種方法可用:

  1. (Nuget 2.7+):Visual Studio -> 工具 -> 包管理器 -> 包管理器設置 -> 啟用自動包還原
  2. (Nuget 2.6 及更低版本)右鍵點擊解決方案並點擊“為此解決方案啟用包還原”。


從命令行建構解決方案時需要**命令行包還原;**它是在 NuGet 的早期版本中引入的,但在 NuGet 2.7 中得到了改進。

nuget.exe restore contoso.sln

MSBuild 集成的包還原 方法是原始的包還原實現,儘管它在許多場景中繼續有效,但它並未涵蓋其他兩種方法解決的全部場景。

如果您使用的是 MSBuild 15 或更高版本附帶的 Visual Studio 2017 或更高版本,並且您的 .csproj 文件採用PackageReference格式,最簡單的方法是使用新的 MSBuildRestore目標


沒有人真正回答過最初的問題,即“在使用 MSBuild 從命令行建構時,如何讓 NuGet 包自動恢復?” 答案是:除非您使用“啟用 NuGet 包還原”選項(現在根據此參考已棄用),否則您不能(但請參見下文)。如果您嘗試在 CI 伺服器上進行自動化建構,這很糟糕。

然而,有一個稍微迂迴的方式來獲得所需的行為:

  1. 從https://dist.nuget.org/win-x86-commandline/latest/nuget.exe下載最新的 NuGet 執行檔,並將其放在 PATH 中的某個位置。(您可以將此作為預建構步驟。)
  2. 執行nuget restore它將自動下載所有失去的包。
  3. 執行msbuild以建構您的解決方案。

順便說一句:雖然新的和推薦的自動包恢復方法在您的版本控制中減少了混亂,但它也使命令行包恢復不可能,除非您跳過額外的下載和執行環節nuget.exe。進步?

引用自:https://stackoverflow.com/questions/22300375