2017-08-26 153 views
8

我有一個asp.net核心項目,與VS正確構建,但不建立在msbuild下。dotnet恢復vs. nuget恢復與teamcity

我使用的TeamCity和構建過程是一個恢復的NuGet的一部分,它沒有找到所有常見的庫(系統等)。

我試圖做與teamcity相同的步驟,但手動使用msbuild,它失敗了,找不到libs。

我添加了一個dotnet恢復步驟,然後它工作。

那麼,nuget還原點網絡還原有什麼區別?

+0

我懷疑是因爲DOTNET恢復工作,但的NuGet沒有對團隊市明的NuGet是較舊的版本,不支持瞭解PackageReferences。 NuGet將需要至少4.0版本。 –

+0

我們遇到同樣的問題,dotnet恢復工作,但nuget恢復不工作。對於我們來說,這是發生在TeamCity和本地。 – r12

回答

13

nuget restoredotnet restore大致相同:它們執行nuget恢復操作。

唯一區別:dotnet restore是調用dotnet msbuild /t:Restore的便捷包裝,它調用了msbuild集成的恢復。這隻適用於包含NuGet的msbuild分發版,例如VS 2017(完整版VS,構建工具)或Mono 5.2+(=>msbuild /t:Restore)以及提供此便捷命令的.NET Core Sdk。

目前,有2種方式如何的NuGet軟件包可以在項目中使用(3實際上,但是讓我們忽略project.json上UWP暫時):

  • packages.config:引用的「經典」的方式NuGet包。這假設NuGet是一個單獨的工具,msbuild不知道任何關於NuGet的信息。諸如nuget.exe或VS集成工具之類的NuGet客戶端會看到packages.config文件,並在恢復時將引用的軟件包下載到本地文件夾中。軟件包安裝將修改項目以從該本地文件夾中引用資源。因此,packages.config項目的恢復只會下載文件。
  • PackageReference:該項目包含引用NuGet包的MSBuild項目。與packages.config不同,只列出了直接依賴關係,項目文件不直接引用包中的任何資產(dll文件,內容文件)。在恢復時,NuGet通過評估直接和傳遞依賴關係來確定依賴關係圖,確保將所有包下載到用戶的全局包緩存中(而不是解決方案本地,因此只下載一次),並將資產文件寫入obj文件夾其中包含項目使用的所有軟件包和資產的列表,以及如果任何軟件包包含需要添加到項目中的構建邏輯的附加msbuild目標。因此,nuget恢復可能會下載軟件包,如果它們尚未位於全局緩存中並創建此資產文件。除了包的引用,該項目也可以參考CLI工具,它是包含額外的命令,將可用於在項目目錄的dotnet的NuGet包。

的MSBuild的集成恢復僅適用於PackageReference類型項目(.NET標準,.NET核心默認,但選擇將其任何.NET項目),而不是爲packages.config項目。如果您使用nuget.exe(例如4.3.0)的新版本,則可以恢復兩種項目類型。

你有關丟失的錯誤類型是更加有趣:「參考組件」(即作爲輸入傳遞到編譯庫)沒有安裝在系統上,但通過的NuGet包來。因此,只要包裝的NuGet從全局包緩存丟失或obj/project.assets.json文件還沒有被恢復操作產生的,基本類型,如System.Object將無法​​使用編譯器。

+0

這很清楚事情!謝謝!有鑑於此,是否有理由再使用package.config機制? – Thomas

+1

'內容'功能(將文件複製到消費項目的源文件)已被刪除並替換爲'contentFiles'功能。另外,'PackageReference'只適用於VS 2017+(NuGet 4. *,MSBuild 15+) –

-1

Nuget恢復將確保您的nuget依賴關係已下載並可用於您的項目。而dotnet恢復是所有nuget依賴關係以及引用和項目特定工具的完整恢復。這意味着如果你運行nuget restore,你只需要恢復nuget包。

根據docs.microsoft.com:Dotnet Restore

的dotnet的恢復命令使用的NuGet恢復的依賴,以及那些在項目文件中指定的特定項目的工具...

+0

''nuget.exe恢復'''PackageReference'類型項目的'dotnet恢復'也是一樣的。 –

0

我曾與一個.NET核心2項目類似的問題,將建立我的工作站上就好了 - 無論是內部的Visual Studio 2017年的MSBuild只使用 - 但在TeamCity的沒有建立。該errormessage的是:

C:\Program Files\dotnet\sdk\2.1.4\Sdks\Microsoft.NET.Sdk\build\Microsoft.PackageDependencyResolution.targets(327, 5): 
Assets file 'D:\TeamCity\buildAgent\work\596486b1d4e7a8e7\Source\Integrations\SomeAPI\obj\project.assets.json' not found. 
Run a NuGet package restore to generate this file. 

在我的構建配置中我已經有一個的NuGet構建步驟之前,安裝步驟:

  • NuGetversion:3.4.4
  • 恢復模式:安裝

原來,我不得不使用:

  • 的NuGet版本:4.0.0或更高
  • 恢復模式:恢復(需要的NuGet 2.7+)