我有一个asp.net核心项目,可以使用VS正确构建,但不会在msbuild下构建。
它找不到所有常用的库(系统等)
我使用的是teamcity,部分构建过程是nuget恢复。
我尝试执行与teamcity相同的步骤,但是手动使用msbuild,它失败了,没有找到lib。
我添加了一个dotnet还原步骤,然后就可以了。
那么, nuget restore 和 dotnet restore 之间的区别是什么?
答案 0 :(得分:51)
nuget restore
和dotnet 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步骤:
原来我必须使用:
答案 2 :(得分:-1)
Nuget还原将确保您的所有nuget依赖项都已下载并可供项目使用。而dotnet还原是对所有nuget依赖项以及引用和项目特定工具的完全恢复。这意味着如果您运行nuget restore,则仅恢复nuget包。
根据docs.microsoft.com:Dotnet Restore
dotnet restore命令使用NuGet恢复依赖项以及项目文件中指定的项目特定工具...