MSBuild:错误 MSB4057:目标在项目中不存在

MSBuild: error MSB4057: The target does not exist in the project

我们正在将我们的编译系统迁移到msbuild,我们发现一些项目报告以下错误:

c:\src\libs\a_lib\A\A.vcxproj : error MSB4057: The target "C" does not exist in the project.

c:\src\libs\a_lib\B\B.vcxproj : error MSB4057: The target "C" does not exist in the project.

c:\src\libs\a_lib\C\C.vcxproj : error MSB4057: The target "C" does not exist in the project.

c:\src\libs\a_lib\D\D.vcxproj : error MSB4057: The target "C" does not exist in the project.

编译行是

msbuild "c:\src\libs\a_lib\a_lib.sln" /nologo "/target:C" /t:build "/p:Configuration=Release" "/p:Platform=Win32"

可以看出,解决方案有几个项目。项目本身存在于解决方案中,可以从 VS IDE 中编译。此外,其他目标不会失败(以下示例:A、B、D)。

我们之前的编译行在同一个项目上工作正常:

devenv "c:\src\libs\a_lib\a_lib.sln" /project "C" /build /nologo "Release|Win32"

问题是因为此类项目嵌套在解决方案资源管理器中的解决方案文件夹(本例中为 Tests)中。目标名称必须包含此类文件夹的名称 (Tests\C),因此正确的编译行是

msbuild "c:\src\libs\a_lib\a_lib.sln" /nologo "/target:Tests\C" /t:build "/p:Configuration=Release" "/p:Platform=Win32"

如其他答案所示,该问题与 msbuild 未找到目标项目有关。除了错误的路径之外,还有另一个潜在的原因:多目标。
这发生在我的非 SDK 样式项目中,当引用 SDK 样式项目时,同时针对:net461 和 netstandard2.0。在这种情况下,您可能必须通过同时定义项目引用的目标框架来扩展非 SDK 样式项目中的项目引用:

<ProjectReference Include="..\..\myProjRef.csproj">
  <Project>{d1b31534-48ae-428e-a174-b679fda90dde}</Project>
  <Name>MyProjRef</Name>
  <AdditionalProperties>TargetFramework=net461</AdditionalProperties>
</ProjectReference>

注意,<AdditionalProperties> 指定:TargetFramework=net461 指向 MyProjRef 项目中的特定目标并删除了错误。