我有一个 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 C
,proj 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 C
和proj 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包中,而不是在同一个解决方案中使用它们?
proj A
还是proj D
引起的?您可以逐个构建项目,而不是解决方案。如果错误来自于proj D
,则应该将Newtonsoft
包添加到proj D
中。如果错误来自于proj A
,请尝试使用命令行还原nuget包:msbuild /t:restore "YourSolutionFile.sln"
- Leo Liumsbuild /t:restore "YourSolutionFile.sln"
就是诀窍!谢谢! - Alex McLean