【问题标题】:'dotnet restore' vs. 'nuget restore' with TeamCity使用 TeamCity 的“dotnet restore”与“nuget restore”
【发布时间】:2018-02-04 10:34:50
【问题描述】:

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

它没有找到所有的通用库(系统等)。

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

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

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

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

【问题讨论】:

  • 我怀疑由于 dotnet restore 有效,但 nuget 没有,Team City 上的 nuget 是不了解 PackageReferences 的旧版本。 NuGet 至少需要 4.0 版。
  • 我们遇到了同样的问题,dotnet restore 有效,但 nuget restore 无效。对我们来说,这发生在 TeamCity 和本地。
  • 事情对我来说更奇怪。 nuget restore 告诉我它无法解析单个包。如果我然后使用dotnet restore 它会下载一些包,但是我的msbuild 由于缺少包仍然无法编译解决方案。如果我然后再次执行nuget restore,它会突然找到所有内容,然后随后的msbuild 可以工作......显然,我的项目中的包配置方式发生了一些非常奇怪的事情。

标签: .net msbuild nuget teamcity


【解决方案1】:

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

根据 docs.microsoft.com:Dotnet Restore

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

【讨论】:

  • nuget.exe restore 对于PackageReference 类型的项目也与dotnet restore 相同。
【解决方案2】:

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 通过评估直接和传递依赖关系来计算依赖关系图,确保所有包都下载到用户的全局包缓存中(不是本地解决方案,因此只下载一次)并将资产文件写入 @987654333 @ 文件夹,其中包含项目使用的所有包和资产的列表,以及其他 MSBuild 目标(如果任何包包含需要添加到项目的构建逻辑)。因此,如果包尚未在全局缓存中,NuGet 还原可能会下载包并创建此资产文件。除了包引用之外,该项目还可以引用 CLI 工具,这些工具是 NuGet 包,其中包含可用于项目目录中的 dotnet 的附加命令。

msbuild-integrated 恢复仅适用于 PackageReference 类型的项目(默认为 .NET Standard、.NET Core,但它适用于任何 .NET 项目),不适用于 packages.config 项目。如果您使用新版本的nuget.exe(例如4.3.0),它可以恢复两种项目类型。

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

【讨论】:

  • 这说明了很多事情!谢谢!鉴于此,是否有理由再使用 package.config 机制?
  • content 功能(将文件复制到使用项目的源)已被删除并替换为contentFiles 功能。此外,PackageReference 仅适用于 VS 2017+(NuGet 4.*、MSBuild 15+)
【解决方案3】:

我在 .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+)

【讨论】:

    【解决方案4】:

    它们都不适合我。在创建项目时,我选择了启用 Razor 运行时优化的选项。这导致了构建错误。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-17
      相关资源
      最近更新 更多