Dot-Net

使用 TeamCity 的“dotnet restore”與“nuget restore”

  • August 26, 2017

我有一個可以使用 Visual Studio 正確建構的 ASP.NET Core 項目,但它不能在 MSBuild 下建構。

它沒有找到所有公共庫(系統等)。

我正在使用 TeamCity,建構過程的一部分是nuget restore.

我嘗試執行與 TeamCity 相同的步驟,但使用 MSBuild 手動執行,但失敗了,沒有找到庫。

我添加了一個dotnet restore步驟,然後它起作用了。

nuget restore那麼,a和 a 有什麼區別dotnet restore呢?

兩者nuget restoredotnet restore大致相同:它們執行 NuGet 還原操作。

唯一的區別是:dotnet restore呼叫一個方便的包裝器,dotnet msbuild /t:Restore它呼叫一個 MSBuild 集成的恢復。這僅適用於包含 NuGet 的 MSBuild 發行版,例如 Visual Studio 2017(完整的 Visual Studio,建構工具)或 Mono 5.2+ (=> msbuild /t:Restore) 和提供此便利命令的 .NET Core SDK。

目前,有兩種方法可以在項目中使用 NuGet 包(實際上是三種,但我們project.json暫時忽略 UWP):

  • packages.config:引用 NuGet 包的“經典”方式。這假定 NuGet 是一個單獨的工具,並且 MSBuild 對 NuGet 一無所知。NuGet 客戶端(例如nuget.exeVisual Studio 集成工具)會看到該packages.config文件並將引用的包下載到還原時的本地文件夾中。包安裝會修改項目以引用此本地文件夾之外的資產。因此,項目的恢復packages.config只下載文件。
  • PackageReference:該項目包含引用 NuGet 包的 MSBuild 項。與 不同packages.config的是,僅列出了直接依賴項,並且項目文件不直接引用包中的任何資產(DLL 文件、內容文件)。在還原時,NuGet 通過評估直接和傳遞依賴關係來計算依賴關係圖,確保所有包都下載到使用者的全域包記憶體中(不是本地解決方案,因此只下載一次)並將資產文件寫入obj文件夾,其中包含項目使用的所有包和資產的列表,以及其他 MSBuild 目標(如果任何包包含需要添加到項目的建構邏輯)。因此,如果包尚未在全域記憶體中,NuGet 還原可能會下載包並創建此資產文件。除了包引用之外,該項目還可以引用 CLI 工具,這些工具是 NuGet 包,其中包含可用於dotnet項目目錄中的附加命令。

msbuild-integrated 恢復僅適用於PackageReference類型項目(預設為 .NET Standard、.NET Core,但對於任何 .NET 項目都是可選的),不適用於packages.config項目。如果您使用新版本nuget.exe(例如 4.3.0),則可以恢復這兩種項目類型。

您關於缺少類型的錯誤更有趣:“參考程序集”(作為輸入傳遞給編譯器的庫)未安裝在系統上,而是通過 NuGet 包提供。因此,只要全域包記憶體中缺少 NuGet 包或obj/project.assets.json文件尚未由還原操作生成,System.Object編譯器就無法使用類似的基本類型。

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