c# - 还原 VS 2019 16.5.0 后找不到 Nuget 包

标签 c# nuget visual-studio-2019

我整个上午都在与 nuget 作斗争,试图获得一个在 UI 和命令行中构建的解决方案。这是最新的问题,我还没有取得任何进展:

  • 我正在对解决方案文件运行 nuget restore。这有效,所有引用的包都已恢复 - 我可以在解决方案文件夹下的/packages 文件夹中看到文件。
  • 我正在使用 devenv 命令行构建 - 我必须这样做,因为此解决方案包含 msbuild 不支持的项目类型。
  • 引用 nuget 包的第一个项目无法使用 ...cs(3,7,3,17) 进行编译:错误 CS0246:找不到类型或命名空间名称“Newtonsoft”(是你缺少 using 指令或程序集引用?)
  • 项目在 UI 中构建(并重新构建,并在清除包文件夹的情况下重新构建)很好,但命令行构建看不到恢复的包。
  • 失败的构建位于我正在构建 UI 的同一台计算机上的 CLEAN 文件夹中,因此它来自源代码管理、nuget 恢复、devenv 构建。

我尝试过的事情

  • 在项目文件中寻找错误的提示路径(在另一个问题/答案中看到了这一点)。这些引用根本不会出现在项目文件中 - 尝试添加它们会产生错误,指出无法添加引用,因为它已由构建系统自动添加。
  • 验证文件在还原后确实存在。
  • 在构建 UI 的 SAME 文件夹中从命令行执行相同的步骤。这很好用。

我错过了什么?这不应该那么难..

更新:该解决方案包含 14 个项目:9 个 C# 类库、2 个 c# 应用程序、1 个报告服务项目和 2 个 WiX 安装程序项目。所有 C# 项目都以 Net472 为目标,而不是核心。解决方案结构的关键部分似乎是:

  • 项目 A 引用资料
    • Newtonsoft.Json 通过 nuget
  • 项目 B 引用资料
    • 项目A
    • Newtonsoft.Json 通过 nuget
    • 通过 nuget 的其他包

在构建期间,由于缺少对 Newtonsoft.Json 的引用,项目 B 无法编译。项目 A 和所有其他 nuget 包都作为引用提供给编译器。同样,所有 nuget 包实际上都已恢复 - 项目 A 找到 Newtonsoft.Json,项目 B 没有。

在详细的 msbuild 日志输出中,这是在项目 10(上面的项目 B)的构建中唯一提到的 Newtonsoft.Json:

10>  Dependency "Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed".
10>      Resolved file path is "...ProjectA\bin\Release\Newtonsoft.Json.dll".
10>      Reference found at search path location "...ProjectA\bin\Release".
10>          For SearchPath "...ProjectA\bin\Release".
10>          Considered "...ProjectA\bin\Release\Newtonsoft.Json.winmd", but it didn't exist.
10>      Required by "...ProjectA\bin\Release\ProjectA.dll".
10>      Required by "C:\...ProjectA2\bin\Release\ProjectA2.dll".
10>      Found related file "...ProjectA\bin\Release\Newtonsoft.Json.xml".
10>      The ImageRuntimeVersion for this reference is "v4.0.30319".

(文件夹和项目名称已被遮盖)

最佳答案

这里发生了几件事,终于找到了一个可行的解决方案。为什么这个内置在 IDE 中是任何人的猜测 - 它添加了一些额外的 secret 调味料来使事情正常进行(不仅仅是自动 nuget 恢复)。

  • 我尝试更改所有项目以使用 PackageRef 而不是 packages.config。这导致 nuget 恢复失败,并出现一个我没有尝试诊断的模糊 msbuild 错误。
  • 我注意到在 .csproj 文件中使用普通引用元素引用了一些 nuget 包,但其中一些不是(特别是“项目 B”中的 Newtonsoft.Json - 还有一些我没有注意到由于 B 失败)。

要纠正这种情况:

  1. 删除对 PackageRef 元素的所有使用 - 在所有项目中改回 packages.config
  2. 确保 .csproj 文件中引用了每个 nuget 提供的 DLL。您必须通过手动编辑 csproj 文件来执行此操作 - IDE 不允许您添加缺少的引用。

我假设这是暂时的情况,从长远来看,解决方案是在任何地方都使用 PackageReference。

关于c# - 还原 VS 2019 16.5.0 后找不到 Nuget 包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60819473/

相关文章:

visual-studio - Visual Studio 2017 Professional - 无法在源代码中找到包

command-prompt - 如何使用命令行在 Visual Studio 2019 中打开项目?

c++ - 如何在visual studio上过滤调试输出窗口?

c# - 为什么字符串常量上的 switch-case 语句在 Visual Studio 2019(16.0.3 之前)中需要默认值,但在 Visual Studio 2017 中不需要?

c# - 从另一个子窗体打开一个子窗体并将 MDI 设置为父窗体 - 怎么办?

c# - Linq groupBy IGrouping 以简单/干净的方式列出 <>

.net - 没有nuget包管理器的Nuget包?

c# - 如何抑制 Tasks.Task 不同的 PublicKeyToken 错误

c# - 不允许移动到下一个字段的字段验证器

c# - 在 C# 名称中使用非标准英文字符是一种不好的做法吗?