MSBuild在包含其他.NET Framework项目的解决方案中无法找到.NET Standard项目的包。

7

我有一个 Visual Studio 解决方案,其中包含:

  • 2 个 .NET Standard 2.0 项目 (.csproj)
    • proj A (类库): 项目引用 -> proj B,没有 Nuget 包。
    • proj B (类库): 没有项目引用,也没有 Nuget 包。
  • 2 个 .NET Framework 4.7.2 项目 (.csproj)
    • proj C (类库): 项目引用 -> proj B,几个 Nuget 包。
    • proj D (测试项目): 项目引用 -> proj Cproj B&proj A,多个 Nuget 包。

这个解决方案在我的本地机器上使用 VS Community 2017 15.7.3 版本可以成功构建。 同时,在我的构建机器上,使用相同版本的 VS 中的 MSBuild 也能够正常构建。

问题

当我向proj A添加一个 Nuget 包(在这个例子中是 Newtonsoft) 时,问题就出现了。在我的本地机器上,解决方案可以成功构建,但使用 MSBuild 时则失败了。而当我在使用那台已经安装了 Visual Studio 的构建机器上加载解决方案时,它也能够正常构建。

报错信息如下:

error CS0246: The type or namespace name 'Newtonsoft' could not be found (are you missing a using directive or an assembly reference?)

我认为问题出在.NET Standard.NET Framework项目在同一个.sln中使用 Nuget 不兼容。因为,当我完全删除proj Cproj D时,在我的构建机器上就可以成功构建。同时我还可以确认,Newtonsoft包在我的 C:/User/.nuget/packages 文件夹中,但不在解决方案目录下的 ./packages 文件夹中(我相信这应该是因为它是一个.NET Standard项目?)。

CI .yml 文件

nuget.exe restore $SOLUTION_FILE
MSBuild.exe '/p:Configuration=release' $SOLUTION_FILE

注意事项

我做了很多阅读,试图找到类似于这个问题的答案,但最接近的是看起来很像这个问题。 这个问题相似,但它是将.NET Standard项目本身作为Nuget包使用,而我正在尝试将Nuget包放入.NET Standard项目本身中。也许我需要将所有的.NET Standard项目提取到一个Nuget包中,而不是在同一个解决方案中使用它们?


你的.NET框架项目中是否包含packages.config文件? - Ankit Mishra
@AnkitMishra 是的,他们会。 - Alex McLean
1
错误 CS0246是从proj A还是proj D引起的?您可以逐个构建项目,而不是解决方案。如果错误来自于proj D,则应该将Newtonsoft包添加到proj D中。如果错误来自于proj A,请尝试使用命令行还原nuget包:msbuild /t:restore "YourSolutionFile.sln" - Leo Liu
使用 msbuild /t:restore "YourSolutionFile.sln" 就是诀窍!谢谢! - Alex McLean
1个回答

3

正如Leo Lieu所指出的那样,使用msbuild /t:restore "YourSolutionFile.sln"是个好方法,尽管我还得运行nuget.exe restore "YourSolutionFile.sln",这让我感到有些奇怪...


请访问以下链接以查看有关该问题的讨论:https://github.com/dotnet/standard/issues/481 - Michael Brown

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接