[英]'dotnet restore' vs. 'nuget restore' with TeamCity
我有一个使用 Visual Studio 正确构建的 ASP.NET Core 项目,但它不是在 MSBuild 下构建的。
它没有找到所有的公共库(系统等)。
我正在使用 TeamCity,构建过程的一部分是nuget restore
。
我尝试执行与 TeamCity 相同的步骤,但使用 MSBuild 手动执行,但失败了,未找到库。
我添加了一个dotnet restore
步骤,然后它起作用了。
那么, nuget restore
和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 包(实际上是三种,但我们暂时忽略 UWP 上的project.json
):
packages.config
:引用 NuGet 包的“经典”方式。 这假设 NuGet 是一个单独的工具,并且 MSBuild 对 NuGet 一无所知。 NuGet 客户端(例如nuget.exe
或 Visual Studio 集成工具)会看到packages.config
文件,并在还原时将引用的包下载到本地文件夹中。 包安装修改项目以引用此本地文件夹之外的资产。 因此, packages.config
项目的还原只会下载文件。PackageReference
:该项目包含引用 NuGet 包的 MSBuild 项。 与packages.config
不同,只列出了直接依赖项,项目文件不直接引用包外的任何资产(DLL 文件、内容文件)。 还原时,NuGet 通过评估直接依赖和传递依赖来计算依赖图,确保所有包都下载到用户的全局包缓存中(不是本地解决方案,因此只下载一次)并将资产文件写入obj
文件夹包含项目使用的所有包和资产的列表,以及其他 MSBuild 目标(如果任何包包含需要添加到项目的构建逻辑)。 因此,如果包不在全局缓存中,NuGet 还原可能会下载包并创建此资产文件。 除了包引用之外,项目还可以引用 CLI 工具,这些工具是 NuGet 包,其中包含可用于项目目录中的dotnet
其他命令。 msbuild 集成还原仅适用于PackageReference
类型项目(默认情况下为 .NET Standard、.NET Core,但它对于任何 .NET 项目都是可选的),不适用于packages.config
项目。 如果您使用新版本的nuget.exe
(例如 4.3.0),它能够恢复这两种项目类型。
您关于缺少类型的错误更有趣:“引用程序集”(作为输入传递给编译器的库)未安装在系统上,而是通过 NuGet 包来的。 因此,只要全局包缓存中缺少 NuGet 包,或者还原操作未生成obj/project.assets.json
文件,编译器将无法使用System.Object
等基本类型。
我在 .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 安装步骤:
结果我不得不使用:
nuget restore
将确保您的所有 NuGet 依赖项都已下载并可用于您的项目。 而dotnet restore
是对所有 NuGet 依赖项以及引用和项目特定工具的完整还原。 这意味着如果您运行nuget restore
,您只会恢复 NuGet 包。
根据 docs.microsoft.com:Dotnet 还原
dotnet restore
命令使用 NuGet 来恢复依赖项以及项目文件中指定的项目特定工具...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.