我有一个 ASP.NET Core 项目,可以使用 Visual Studio 正确构建,但不能在 MSBuild 下构建。
它没有找到所有公共库(系统等)。
我正在使用 TeamCity,构建过程的一部分是nuget restore
.
我尝试执行与 TeamCity 相同的步骤,但使用 MSBuild 手动执行,但失败了,没有找到库。
我添加了一个dotnet restore
步骤然后就成功了。
那么,a 和 a 有什么区别nuget restore
and a dotnet restore
?
Both nuget restore
and 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 包(实际上是三种,但让我们忽略project.json
目前在 UWP 上):
-
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 包提供。因此,只要全局包缓存或obj/project.assets.json
文件尚未由恢复操作生成,基本类型如System.Object
编译器将无法使用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)