2017-08-26 152 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+)