Skip to content

Building a VS solution file at the command line now causes MSB4057 #6373

Closed
@snalexp

Description

@snalexp

Issue Description

I have a solution file with several projects in and use -targets to selectively build some projects in this solution.

Using

msbuild --version
Microsoft (R) Build Engine version 16.9.0+5e4b48a27 for .NET Framework
Copyright (C) Microsoft Corporation. All rights reserved.

16.9.0.16703

The following works:

msbuild -p:Platform=x64 -p:Configuration=Debug -t:banana SolutionFile.sln

but since installing VS 2019 16.10 Preview 2.1, I now receive error MSB4057: The target "banana" does not exist in the project. for every project in the solution.

I think this update to Visual Studio brought this version of MSBuild with it:

msbuild --version
Microsoft (R) Build Engine version 16.10.0-preview-21181-05+80f316e90 for .NET Framework
Copyright (C) Microsoft Corporation. All rights reserved.

16.10.0.18105

Steps to Reproduce

I have been unable to reproduce this issue in a new project. Unfortunately I cannot share the entire solution with you, nor is it open source.

Expected Behavior

The specified project is targeted and built from the solution.

Actual Behavior

The build does not complete.

Analysis

I emitted the metaproj for build instances, and it looks like there are a few differences, but this one looks related. Looking at SolutionFile.slnmetaproj, I have these two blocks:

16.9

  <Target Name="banana" Outputs="@(bananaBuildOutput)">
    <MSBuild Condition="'%(ProjectReference.Identity)' == 'C:\code\banana\msvc\2019\banana.vcxproj'" ToolsVersion="$(ProjectToolsVersion)" BuildInParallel="True" Projects="@(ProjectReference)" Properties="Configuration=Debug; Platform=x64;BuildingSolutionFile=true; CurrentSolutionConfigurationContents=$(CurrentSolutionConfigurationContents); SolutionDir=$(SolutionDir); SolutionExt=$(SolutionExt); SolutionFileName=$(SolutionFileName); SolutionName=$(SolutionName); SolutionPath=$(SolutionPath)">
      <Output TaskParameter="TargetOutputs" ItemName="bananaBuildOutput" />
    </MSBuild>
  </Target>
  <Target Name="banana:Clean">
    <MSBuild Condition="'%(ProjectReference.Identity)' == 'C:\code\banana\msvc\2019\banana.vcxproj'" ToolsVersion="$(ProjectToolsVersion)" BuildInParallel="True" Projects="@(ProjectReference)" Targets="Clean" Properties="Configuration=Debug; Platform=x64;BuildingSolutionFile=true; CurrentSolutionConfigurationContents=$(CurrentSolutionConfigurationContents); SolutionDir=$(SolutionDir); SolutionExt=$(SolutionExt); SolutionFileName=$(SolutionFileName); SolutionName=$(SolutionName); SolutionPath=$(SolutionPath)" />
  </Target>
  <Target Name="banana:Rebuild" Outputs="@(bananaBuildOutput)">
    <MSBuild Condition="'%(ProjectReference.Identity)' == 'C:\code\banana\msvc\2019\banana.vcxproj'" ToolsVersion="$(ProjectToolsVersion)" BuildInParallel="True" Projects="@(ProjectReference)" Targets="Rebuild" Properties="Configuration=Debug; Platform=x64;BuildingSolutionFile=true; CurrentSolutionConfigurationContents=$(CurrentSolutionConfigurationContents); SolutionDir=$(SolutionDir); SolutionExt=$(SolutionExt); SolutionFileName=$(SolutionFileName); SolutionName=$(SolutionName); SolutionPath=$(SolutionPath)">
      <Output TaskParameter="TargetOutputs" ItemName="bananaBuildOutput" />
    </MSBuild>
  </Target>
  <Target Name="banana:Publish">
    <MSBuild Condition="'%(ProjectReference.Identity)' == 'C:\code\banana\msvc\2019\banana.vcxproj'" ToolsVersion="$(ProjectToolsVersion)" BuildInParallel="True" Projects="@(ProjectReference)" Targets="Publish" Properties="Configuration=Debug; Platform=x64;BuildingSolutionFile=true; CurrentSolutionConfigurationContents=$(CurrentSolutionConfigurationContents); SolutionDir=$(SolutionDir); SolutionExt=$(SolutionExt); SolutionFileName=$(SolutionFileName); SolutionName=$(SolutionName); SolutionPath=$(SolutionPath)" />
  </Target>

16.10

  <Target Name="banana">
    <MSBuild BuildInParallel="True" SkipNonexistentProjects="%(ProjectReference.SkipNonexistentProjects)" Projects="@(ProjectReference)" Targets="banana" Properties="BuildingSolutionFile=true; CurrentSolutionConfigurationContents=$(CurrentSolutionConfigurationContents); SolutionDir=$(SolutionDir); SolutionExt=$(SolutionExt); SolutionFileName=$(SolutionFileName); SolutionName=$(SolutionName); SolutionFilterName=$(SolutionFilterName); SolutionPath=$(SolutionPath)" />
  </Target>
  <Target Name="banana:Clean">
    <MSBuild Condition="'%(ProjectReference.Identity)' == 'C:\code\banana\msvc\2019\banana.vcxproj'" ToolsVersion="$(ProjectToolsVersion)" BuildInParallel="True" Projects="@(ProjectReference)" Targets="Clean" Properties="Configuration=Debug; Platform=x64;BuildingSolutionFile=true; CurrentSolutionConfigurationContents=$(CurrentSolutionConfigurationContents); SolutionDir=$(SolutionDir); SolutionExt=$(SolutionExt); SolutionFileName=$(SolutionFileName); SolutionName=$(SolutionName); SolutionFilterName=$(SolutionFilterName); SolutionPath=$(SolutionPath)" />
  </Target>
  <Target Name="banana:Rebuild" Outputs="@(bananaBuildOutput)">
    <MSBuild Condition="'%(ProjectReference.Identity)' == 'C:\code\banana\msvc\2019\banana.vcxproj'" ToolsVersion="$(ProjectToolsVersion)" BuildInParallel="True" Projects="@(ProjectReference)" Targets="Rebuild" Properties="Configuration=Debug; Platform=x64;BuildingSolutionFile=true; CurrentSolutionConfigurationContents=$(CurrentSolutionConfigurationContents); SolutionDir=$(SolutionDir); SolutionExt=$(SolutionExt); SolutionFileName=$(SolutionFileName); SolutionName=$(SolutionName); SolutionFilterName=$(SolutionFilterName); SolutionPath=$(SolutionPath)">
      <Output TaskParameter="TargetOutputs" ItemName="bananaBuildOutput" />
    </MSBuild>
  </Target>
  <Target Name="banana:Publish">
    <MSBuild Condition="'%(ProjectReference.Identity)' == 'C:\code\banana\msvc\2019\banana.vcxproj'" ToolsVersion="$(ProjectToolsVersion)" BuildInParallel="True" Projects="@(ProjectReference)" Targets="Publish" Properties="Configuration=Debug; Platform=x64;BuildingSolutionFile=true; CurrentSolutionConfigurationContents=$(CurrentSolutionConfigurationContents); SolutionDir=$(SolutionDir); SolutionExt=$(SolutionExt); SolutionFileName=$(SolutionFileName); SolutionName=$(SolutionName); SolutionFilterName=$(SolutionFilterName); SolutionPath=$(SolutionPath)" />
  </Target>
  <Target Name="banana:banana">
    <MSBuild Condition="'%(ProjectReference.Identity)' == 'C:\code\banana\msvc\2019\banana.vcxproj'" ToolsVersion="$(ProjectToolsVersion)" BuildInParallel="True" Projects="@(ProjectReference)" Targets="banana" Properties="Configuration=Debug; Platform=x64;BuildingSolutionFile=true; CurrentSolutionConfigurationContents=$(CurrentSolutionConfigurationContents); SolutionDir=$(SolutionDir); SolutionExt=$(SolutionExt); SolutionFileName=$(SolutionFileName); SolutionName=$(SolutionName); SolutionFilterName=$(SolutionFilterName); SolutionPath=$(SolutionPath)" />
  </Target>

After inspecting these generated targets, I can confirm that -t:banana:Clean works in both cases i.e.

msbuild -p:Platform=x64 -p:Configuration=Debug -t:banana:Clean SolutionFile.sln

As does -t:banana:Rebuild.

So I tried -t:banana:banana and this was somewhat of an improvement. It found the correct vcxproj target from the solution but then generated the same error as earlier:

C:\code\banana\msvc\2019\banana.vcxproj : error MSB4057: The target "banana" does not exist in the project.

The main difference between -t:banana and -t:banana:banana is that the former causes MSB4057 for every project in the solution, whereas the latter seems to find the correct project, but then banana does not exist as a target within that project (which makes sense to me).

Versions & Configurations

Working:

msbuild --version
Microsoft (R) Build Engine version 16.9.0+5e4b48a27 for .NET Framework
Copyright (C) Microsoft Corporation. All rights reserved.

16.9.0.16703

Not working:

msbuild --version
Microsoft (R) Build Engine version 16.10.0-preview-21181-05+80f316e90 for .NET Framework
Copyright (C) Microsoft Corporation. All rights reserved.

16.10.0.18105

OS is Windows 10, x64, 20H2 (19042.928)

Attach a binlog

Not available.

Thank you!

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions