'dotnet restore' 对比 'nuget restore' 与 TeamCity
'dotnet restore' vs. 'nuget restore' with TeamCity
我有一个 ASP.NET 核心项目,可以使用 Visual Studio 正确构建,但不能在 MSBuild 下构建。
它没有找到所有公共库(系统等)。
我正在使用 TeamCity,部分构建过程是 nuget restore
。
我尝试执行与 TeamCity 相同的步骤,但手动使用 MSBuild,但失败了,找不到库。
我添加了一个 dotnet restore
步骤,然后它起作用了。
那么,nuget restore
和 dotnet restore
有什么区别?
nuget restore
将确保您的所有 NuGet 依赖项都已下载并可用于您的项目。而 dotnet restore
是对所有 NuGet 依赖项以及引用和项目特定工具的完整还原。这意味着如果您 运行 nuget restore
,您 仅 恢复 NuGet 包。
根据docs.microsoft.com:Dotnet Restore
The dotnet restore
command uses NuGet to restore dependencies as well as project-specific tools that are specified in the project file...
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
:"classic" 引用 NuGet 包的方式。这假定 NuGet 是一个单独的工具,并且 MSBuild 对 NuGet 一无所知。 nuget.exe
或 Visual Studio 集成工具等 NuGet 客户端会看到 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),它可以恢复两种项目类型。
关于缺少类型的错误更有趣:"reference assemblies"(作为输入传递给编译器的库)未安装在系统上,而是通过 NuGet 包提供。因此,只要全局包缓存中缺少 NuGet 包或还原操作未生成 obj/project.assets.json
文件,编译器就无法使用 System.Object
等基本类型。
我在 .NET Core 2 项目中遇到了类似的问题,该项目在我的工作站上构建得很好——在 Visual Studio 2017 年内并且仅使用 MSBuild——但没有在 TeamCity 中构建。错误消息是:
C:\Program Files\dotnet\sdk.1.4\Sdks\Microsoft.NET.Sdk\build\Microsoft.PackageDependencyResolution.targets(327, 5):
Assets file 'D:\TeamCity\buildAgent\work6486b1d4e7a8e7\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+)
None 其中对我有用。在创建项目时,我选择了启用 Razor 运行时优化的选项。这导致了构建错误。
当我在没有那个选项的情况下重新创建同一个项目时,它对我来说工作得很好。
我有一个 ASP.NET 核心项目,可以使用 Visual Studio 正确构建,但不能在 MSBuild 下构建。
它没有找到所有公共库(系统等)。
我正在使用 TeamCity,部分构建过程是 nuget restore
。
我尝试执行与 TeamCity 相同的步骤,但手动使用 MSBuild,但失败了,找不到库。
我添加了一个 dotnet restore
步骤,然后它起作用了。
那么,nuget restore
和 dotnet restore
有什么区别?
nuget restore
将确保您的所有 NuGet 依赖项都已下载并可用于您的项目。而 dotnet restore
是对所有 NuGet 依赖项以及引用和项目特定工具的完整还原。这意味着如果您 运行 nuget restore
,您 仅 恢复 NuGet 包。
根据docs.microsoft.com:Dotnet Restore
The
dotnet restore
command uses NuGet to restore dependencies as well as project-specific tools that are specified in the project file...
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
:"classic" 引用 NuGet 包的方式。这假定 NuGet 是一个单独的工具,并且 MSBuild 对 NuGet 一无所知。nuget.exe
或 Visual Studio 集成工具等 NuGet 客户端会看到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),它可以恢复两种项目类型。
关于缺少类型的错误更有趣:"reference assemblies"(作为输入传递给编译器的库)未安装在系统上,而是通过 NuGet 包提供。因此,只要全局包缓存中缺少 NuGet 包或还原操作未生成 obj/project.assets.json
文件,编译器就无法使用 System.Object
等基本类型。
我在 .NET Core 2 项目中遇到了类似的问题,该项目在我的工作站上构建得很好——在 Visual Studio 2017 年内并且仅使用 MSBuild——但没有在 TeamCity 中构建。错误消息是:
C:\Program Files\dotnet\sdk.1.4\Sdks\Microsoft.NET.Sdk\build\Microsoft.PackageDependencyResolution.targets(327, 5):
Assets file 'D:\TeamCity\buildAgent\work6486b1d4e7a8e7\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+)
None 其中对我有用。在创建项目时,我选择了启用 Razor 运行时优化的选项。这导致了构建错误。
当我在没有那个选项的情况下重新创建同一个项目时,它对我来说工作得很好。