c# - 还原 VS 2019 16.5.0 后找不到 Nuget 包
问题描述
我整个早上都在与 nuget 作斗争,试图从 UI 和命令行中获得一个构建的解决方案。这是最新的问题,我还没有取得任何进展:
- 我正在解决方案文件上运行 nuget restore。这行得通,所有引用的包都已恢复 - 我可以在解决方案文件夹下的 /packages 文件夹中看到文件。
- 我正在使用 devenv 命令行构建 - 我必须这样做,因为此解决方案包含 msbuild 不支持的项目类型。
- 第一个引用 nuget 包的项目无法编译
...cs(3,7,3,17): error CS0246: The type or namespace name 'Newtonsoft' could not be found (are you missing a using directive or an assembly reference?)
- 项目在 UI 中构建(并重新构建,并在清除包文件夹的情况下重新构建)很好,但命令行构建没有看到恢复的包。
- 失败的构建位于我正在执行 UI 构建的同一台计算机上的 CLEAN 文件夹中,因此它来自源代码控制、nuget 还原、devenv 构建。
我尝试过的事情
- 在项目文件中寻找错误的提示路径(在另一个问题/答案中看到)。这些引用根本不会出现在项目文件中 - 尝试添加它们会产生一个错误,指出无法添加引用,因为它已经由构建系统自动添加。
- 验证还原后文件确实存在。
- 从正在构建 UI 的 SAME 文件夹中的命令行执行相同的步骤。这工作正常。
我错过了什么?这不应该那么难..
更新:该解决方案由 14 个项目组成:9 个 C# 类库、2 个 c# 应用程序、1 个报告服务项目和 2 个 WiX 安装程序项目。所有 C# 项目都针对 Net472,而不是 Core。解决方案结构的关键部分似乎是:
- 项目 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 中内置是任何人的猜测 - 它添加了一些额外的秘密酱以使事情正常工作(不仅仅是自动 nuget 恢复)。
- 我尝试将所有项目更改为使用 PackageRef 而不是 packages.config。这导致 nuget restore 失败并出现我没有尝试诊断的模糊 msbuild 错误。
- 我注意到在 .csproj 文件中使用普通 Reference 元素引用了一些 nuget 包,但其中一些没有(特别是“项目 B”中的 Newtonsoft.Json - 以及由于 B 而我没有注意到的其他一些包)失败)。
要纠正这种情况:
- 删除对 PackageRef 元素的所有使用 - 在所有项目中改回 packages.config
- 确保在 .csproj 文件中引用了每个 nuget 提供的 DLL。您必须通过手动编辑 csproj 文件来执行此操作 - IDE 不会让您添加缺少的引用。
我假设这是一种临时情况,从长远来看,解决方案将是在任何地方使用 PackageReference。
推荐阅读
- c++ - 如何设置约束的运动目标?
- sql - 如果列包含特定字符串,则结果为 NULL,否则为另一列,如何在 informatica 中应用此表达式转换?
- php - 我对 PHP in_array 有疑问
- java - 如何将我的 json 文件格式化为多行
- javascript - 为什么可以通过更改函数参数而不是字符串或数字来更改数组或对象?
- wordpress - 如何在wordpress的帖子标题下显示自定义元框?
- javascript - 使用Javascript更改没有按钮的div上的边框颜色
- python - Celery app.control.inspect() 在app对象初始化后第一次调用时随机返回None
- javascript - 通过php codeignitor创建动态javascript文件在php inbuild服务器中失败
- python - 使用 beautifulsoup 进行网页抓取的问题