为啥 dotnet 在 .NET Framework 4.5 项目上构建会抛出“此项目引用了缺失的 NuGet 包”?

Posted

技术标签:

【中文标题】为啥 dotnet 在 .NET Framework 4.5 项目上构建会抛出“此项目引用了缺失的 NuGet 包”?【英文标题】:Why does dotnet build on a .NET Framework 4.5 project throw "This project references NuGet package(s) that are missing"?为什么 dotnet 在 .NET Framework 4.5 项目上构建会抛出“此项目引用了缺失的 NuGet 包”? 【发布时间】:2021-11-29 05:26:02 【问题描述】:

使用终端命令dotnet build在VS Code中构建的示例NotepadAndCalculatorTest项目抛出以下错误:

C:\Program Files\dotnet\sdk\5.0.401\Microsoft.Common.CurrentVersion.targets(820,5): error : The BaseOutputPath/OutputPath property is not set for project 'NotepadCalculatorTest.csproj'.  Please check to make sure that you have specified a valid combination of Configuration and Platform for this project.  Configuration='Debug'  Platform='AnyCPU'.  You may be seeing this message because you are trying to build a project without a solution file, 
and have specified a non-default Configuration or Platform that doesn't exist for this project. [C:\Users\<username>\VSCode Projects\WinAppDriverTryout\Test\Samples\C#\NotepadAndCalculatorTest\NotepadCalculatorTest.csproj]

或者:

NotepadCalculatorTest.csproj(109,5): error : This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is packages\MSTest.TestAdapter.1.2.0\build\net45\MSTest.TestAdapter.props.

有人可以为我指出摆脱错误的可能方法吗?

【问题讨论】:

【参考方案1】:

dotnet build 执行implicit restore 作为命令的一部分。

这使用了dotnet restore,它不支持packages.config 中的项目引用,而这正是这个项目正在使用的。

dotnet restore 仅支持 .csproj 包引用。

这就是为什么,这个项目在 Visual Studio 中构建得非常好,但 dotnet build 会抛出错误。

可以通过在 Visual Stduio 中右键单击文件并单击迁移来将 packages.config 迁移到包引用,但这仍然无法解决您的问题,因为 dotnet cli 可以正常与 . NET Framework 仅当项目是使用 dotnet new 命令创建的。

我假设这个项目是在 Visual Studio 中创建的,因为它有一个 Visual Studio 解决方案文件 - .sln - 因此通常具有不同的结构 .csproj 格式。

这通常会破坏一些 CLI 命令,即使在这种情况下迁移引用也是如此。

您有 2 个解决方法。


1.使用nuget restore

最简单的选择是从here 下载 NuGet CLI 可执行文件,从downloads page 获取。

如果您不在 Windows 上,请使用 this guide by Microsoft。

将其添加到您的 PATH 或将其放在项目的根文件夹中。

运行nuget restore,它与packages.config 兼容(如果您在PowerShell 中信任该命令,则运行.\nuget restore,因为默认情况下PowerShell 不会从当前位置加载命令以确保安全)。

你应该得到类似这样的输出:

PS C:\Users\***\NotepadAndCalculatorTest> .\nuget restore
MSBuild auto-detection: using msbuild version '16.9.0.16703' from 'C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\bin'.
Restoring NuGet package Microsoft.WinAppDriver.Appium.WebDriver.1.0.1-Preview.
Restoring NuGet package Selenium.Support.3.8.0.
Restoring NuGet package Selenium.WebDriver.3.8.0.
Restoring NuGet package Castle.Core.4.2.1.
Restoring NuGet package MSTest.TestFramework.1.2.0.
Restoring NuGet package Newtonsoft.Json.10.0.3.
Restoring NuGet package MSTest.TestAdapter.1.2.0.
Adding package 'MSTest.TestFramework.1.2.0' to folder 'C:\Users\***\NotepadAndCalculatorTest\packages'
Adding package 'Selenium.Support.3.8.0' to folder 'C:\Users\***\NotepadAndCalculatorTest\packages'
Adding package 'Castle.Core.4.2.1' to folder 'C:\Users\***\NotepadAndCalculatorTest\packages'
Adding package 'Microsoft.WinAppDriver.Appium.WebDriver.1.0.1-Preview' to folder 'C:\Users\***\NotepadAndCalculatorTest\packages'
Adding package 'Selenium.WebDriver.3.8.0' to folder 'C:\Users\***\NotepadAndCalculatorTest\packages'
Adding package 'Newtonsoft.Json.10.0.3' to folder 'C:\Users\***\NotepadAndCalculatorTest\packages'
Adding package 'MSTest.TestAdapter.1.2.0' to folder 'C:\Users\***\NotepadAndCalculatorTest\packages'
Added package 'Microsoft.WinAppDriver.Appium.WebDriver.1.0.1-Preview' to folder 'C:\Users\***\NotepadAndCalculatorTest\packages'
Added package 'Selenium.Support.3.8.0' to folder 'C:\Users\***\NotepadAndCalculatorTest\packages'
Added package 'Selenium.WebDriver.3.8.0' to folder 'C:\Users\***\NotepadAndCalculatorTest\packages'
Added package 'Castle.Core.4.2.1' to folder 'C:\Users\***\NotepadAndCalculatorTest\packages'
Added package 'Newtonsoft.Json.10.0.3' to folder 'C:\Users\***\NotepadAndCalculatorTest\packages'
Added package 'MSTest.TestAdapter.1.2.0' to folder 'C:\Users\***\NotepadAndCalculatorTest\packages'
Added package 'MSTest.TestFramework.1.2.0' to folder 'C:\Users\***\NotepadAndCalculatorTest\packages'

NuGet Config files used:
    C:\Users\***\AppData\Roaming\NuGet\NuGet.Config
    C:\Program Files (x86)\NuGet\Config\Microsoft.VisualStudio.FallbackLocation.config
    C:\Program Files (x86)\NuGet\Config\Microsoft.VisualStudio.Offline.config

Feeds used:
    C:\Users\***\.nuget\packages\
    https://api.nuget.org/v3/index.json
    C:\Program Files (x86)\Microsoft SDKs\NuGetPackages\

Installed:
    7 package(s) to packages.config projects

然后运行dotnet build

它不会尝试运行dotnet restore,因为包已经被 NuGet 恢复,所以你不会收到任何错误:

PS C:\Users\***\NotepadAndCalculatorTest> dotnet build 
Microsoft (R) Build Engine version 16.9.0+57a23d249 for .NET
Copyright (C) Microsoft Corporation. All rights reserved.

  Determining projects to restore...
  Nothing to do. None of the projects specified contain packages to restore.
  NotepadCalculatorTest -> C:\Users\***\NotepadAndCalculatorTest\bin\Debug\NotepadCalculatorTest.dll

Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:00:01.08

2。移植项目

第二种解决方法是使用dotnet new 创建一个新项目并将代码移植到上面,以便您的.csproj 文件与dotnet restore 以及随后的dotnet build 一起使用。


除非您不想通过 NuGet 恢复,否则我会推荐选项 1。

【讨论】:

谢谢@Ermiya 的回答,它奏效了!我从 Github 的项目中克隆了一组新文件,然后按照您的说明进行操作。我在 CMD 命令窗口中执行了 nuget restore 后跟 dotnet build。两者都成功运行,没有错误。我在 VS Code 的终端中重复相同的操作,结果同样成功且没有错误。接下来我将比较 csproj 文件和其他文件类型的内容,看看是什么差异导致之前的恢复和构建失败。 @Seibernaut 欢迎您的回答和 Stack Overflow! :) 发现当前运行的版本除了nuget restoredotnet build产生的新文件和包文件夹外,没有任何文件被修改。 `nuget restore' 创建的包文件夹是: .\packages\Castle.Core.4.2.1 .\packages\Microsoft.WinAppDriver.Appium.WebDriver.1.0.1-Preview .\packages\MSTest.TestAdapter.1.2.0 .\packages\MSTest.TestFramework.1.2.0 .\packages\Newtonsoft.Json.10.0.3 .\packages\Selenium.Support.3.8.0 .\packages\Selenium.WebDriver.3.8.0 是的,正确 - 这是使用 dotnet build 失败的包还原,因为它不支持 packages.config

以上是关于为啥 dotnet 在 .NET Framework 4.5 项目上构建会抛出“此项目引用了缺失的 NuGet 包”?的主要内容,如果未能解决你的问题,请参考以下文章

为啥win7安装dotNet4.0失败

为啥我的 dockerfile 中的 dotnet restore 步骤失败?

在 Arch linux 中从终端创建 dotnet(.Net) 项目时出错

翻译.NET 6 中的 dotnet monitor

为啥 Google.Pubsub.V1 beta01 不适用于 dotnet cli 项目?

找到 .NET SDK,但没有找到 dotnet.dll