使用teamcity进行dotnet恢复与nuget恢复

时间:2017-08-26 16:02:01

标签: .net msbuild nuget teamcity

我有一个asp.net核心项目,可以使用VS正确构建,但不会在msbuild下构建。

它找不到所有常用的库(系统等)

我使用的是teamcity,部分构建过程是nuget恢复。

我尝试执行与teamcity相同的步骤,但是手动使用msbuild,它失败了,没有找到lib。

我添加了一个dotnet还原步骤,然后就可以了。

那么, nuget restore dotnet restore 之间的区别是什么?

3 个答案:

答案 0 :(得分:51)

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。

目前,有两种方法可以在项目中使用NuGet包(实际上有3种,但暂时忽略UWP上的project.json):

  • packages.config:" classic"引用NuGet包的方式。这假设NuGet是一个单独的工具,msbuild对NuGet一无所知。 NuGet客户端(例如nuget.exe或VS集成工具)会查看packages.config文件,并在还原时将引用的包下载到本地文件夹中。程序包安装会修改项目以引用此本地文件夹中的资产。因此,packages.config项目的恢复仅下载文件。
  • PackageReference:项目包含引用NuGet包的MSBuild项。与packages.config不同,仅列出直接依赖项,并且项目文件不直接引用包中的任何资产(dll文件,内容文件)。在恢复时,NuGet通过评估直接和传递依赖关系来确定依赖关系图,确保将所有包下载到用户的全局包缓存中(不是解决方案本地,因此只下载一次)并写入资源文件进入obj文件夹,其中包含项目使用的所有包和资产的列表,以及其他msbuild目标(如果任何包包含需要添加到项目的构建逻辑)。因此,nuget恢复可以下载包(如果它们尚未在全局缓存中)并创建此资产文件。除了包引用之外,项目还可以引用CLI工具,这些工具是包含可用于项目目录中dotnet的其他命令的NuGet包。

msbuild集成的恢复仅适用于PackageReference类型的项目(默认情况下为.NET Standard,.NET Core,但对于任何.NET项目都是选择性的),而不适用于packages.config项目。如果您使用新版本的nuget.exe(例如4.3.0),则可以恢复这两种项目类型。

关于缺少类型的错误更有趣:"参考程序集" (作为输入传递给编译器的库)未安装在系统上,而是通过NuGet包来安装。因此,只要全局包缓存中缺少NuGet包,或者还原操作尚未生成obj/project.assets.json文件,编译器就无法使用System.Object等基本类型。

答案 1 :(得分:2)

我在.net core 2项目中遇到了类似的问题,它可以在我的工作站上构建得很好 - 无论是在Visual Studio 2017中还是仅使用msbuild - 但是没有在TeamCity中构建。错误消息是:

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 Install步骤:

  • NuGetversion:3.4.4
  • 还原模式:安装

原来我必须使用:

  • NuGet版本:4.0.0或更高版本
  • 还原模式:还原(需要NuGet 2.7 +)

答案 2 :(得分:-1)

Nuget还原将确保您的所有nuget依赖项都已下载并可供项目使用。而dotnet还原是对所有nuget依赖项以及引用和项目特定工具的完全恢复。这意味着如果您运行nuget restore,则恢复nuget包。

根据docs.microsoft.com:Dotnet Restore

  

dotnet restore命令使用NuGet恢复依赖项以及项目文件中指定的项目特定工具...