繁体   English   中英

TeamCity 的“dotnet restore”与“nuget restore”

[英]'dotnet restore' vs. 'nuget restore' with TeamCity

我有一个使用 Visual Studio 正确构建的 ASP.NET Core 项目,但它不是在 MSBuild 下构建的。

它没有找到所有的公共库(系统等)。

我正在使用 TeamCity,构建过程的一部分是nuget restore

我尝试执行与 TeamCity 相同的步骤,但使用 MSBuild 手动执行,但失败了,未找到库。

我添加了一个dotnet restore步骤,然后它起作用了。

那么, nuget restoredotnet restore之间有什么区别?

nuget restoredotnet 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 版本:3.4.4
  • 恢复模式:安装

结果我不得不使用:

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

他们都没有为我工作。 在创建项目时,我选择了启用 Razor 运行时优化的选项。 这导致了构建错误。 启用 Razor 运行时优化

当我在没有该选项的情况下重新创建同一个项目时,它对我来说效果很好。

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

根据 docs.microsoft.com:Dotnet 还原

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM