使用 TeamCity 的“dotnet restore”與“nuget restore”
我有一個可以使用 Visual Studio 正確建構的 ASP.NET Core 項目,但它不能在 MSBuild 下建構。
它沒有找到所有公共庫(系統等)。
我正在使用 TeamCity,建構過程的一部分是
nuget restore.我嘗試執行與 TeamCity 相同的步驟,但使用 MSBuild 手動執行,但失敗了,沒有找到庫。
我添加了一個
dotnet restore步驟,然後它起作用了。
nuget restore那麼,a和 a 有什麼區別dotnet restore呢?
兩者
nuget restore和dotnet 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編譯器就無法使用類似的基本類型。