MSBuild 在其他 .NET Framework 项目的解决方案中找不到 .NET Standard 项目的包
MSBuild can't find package for .NET Standard project in solution with other .NET Framework projects
我有一个 Visual Studio 解决方案:
- 2 个 .NET Standard 2.0 项目(
.csproj
)
proj A
(class 库):proj refs -> proj B
,没有 Nuget 包
proj B
(class 库):没有项目引用,没有 Nuget 包
- 2 个 .NET Framework 4.7.2 项目(
.csproj
)
proj C
(class 库):proj refs -> proj B
,几个 Nuget 包
proj D
(测试项目):proj refs -> proj C
、proj B
& proj A
、几个 Nuget 包
此解决方案在我的本地计算机上构建良好 运行 VS Community 2017 15.7.3
该解决方案在我的构建机器上也可以正常构建,该机器使用来自同一版本的同一 VS 的 MSBuild
。
问题
当我向 proj A
添加 Nuget 包(在本例中为 Newtonsoft
)时出现问题。该解决方案在我的本地机器上构建良好,但在使用 MSBuild
时 不 工作。此外,如果我使用安装在那里的 VS 在我的构建机器上加载解决方案,它构建得很好。
引发的错误是:
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
备注
我读了很多书试图找到与此类似的问题,但我得到的最接近的是看起来很像 this one 的问题。这个问题是相似的,但使用 .NET Standard
项目本身作为 Nuget 包,因为我试图将 Nuget 包放入 .NET Standard
项目本身。也许我需要将我所有的 .NET Standard
项目提取到一个 Nuget 包中,而不是在同一个解决方案中使用它们?
正如 Leo Lieu 指出的那样,使用 msbuild /t:restore "YourSolutionFile.sln"
是诀窍,尽管我必须像 运行 nuget.exe restore "YourSolutionFile.sln"
那样做,我觉得这很奇怪......
我有一个 Visual Studio 解决方案:
- 2 个 .NET Standard 2.0 项目(
.csproj
)proj A
(class 库):proj refs ->proj B
,没有 Nuget 包proj B
(class 库):没有项目引用,没有 Nuget 包
- 2 个 .NET Framework 4.7.2 项目(
.csproj
)proj C
(class 库):proj refs ->proj B
,几个 Nuget 包proj D
(测试项目):proj refs ->proj C
、proj B
&proj A
、几个 Nuget 包
此解决方案在我的本地计算机上构建良好 运行 VS Community 2017 15.7.3
该解决方案在我的构建机器上也可以正常构建,该机器使用来自同一版本的同一 VS 的 MSBuild
。
问题
当我向 proj A
添加 Nuget 包(在本例中为 Newtonsoft
)时出现问题。该解决方案在我的本地机器上构建良好,但在使用 MSBuild
时 不 工作。此外,如果我使用安装在那里的 VS 在我的构建机器上加载解决方案,它构建得很好。
引发的错误是:
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
备注
我读了很多书试图找到与此类似的问题,但我得到的最接近的是看起来很像 this one 的问题。这个问题是相似的,但使用 .NET Standard
项目本身作为 Nuget 包,因为我试图将 Nuget 包放入 .NET Standard
项目本身。也许我需要将我所有的 .NET Standard
项目提取到一个 Nuget 包中,而不是在同一个解决方案中使用它们?
正如 Leo Lieu 指出的那样,使用 msbuild /t:restore "YourSolutionFile.sln"
是诀窍,尽管我必须像 运行 nuget.exe restore "YourSolutionFile.sln"
那样做,我觉得这很奇怪......