我整个上午都在与 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 失败)。
要纠正这种情况:
- 删除对 PackageRef 元素的所有使用 - 在所有项目中改回 packages.config
- 确保 .csproj 文件中引用了每个 nuget 提供的 DLL。您必须通过手动编辑 csproj 文件来执行此操作 - IDE 不允许您添加缺少的引用。
我假设这是暂时的情况,从长远来看,解决方案是在任何地方都使用 PackageReference。
关于c# - 还原 VS 2019 16.5.0 后找不到 Nuget 包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60819473/