fsprojects/ProjectScaffold

Error: The target "Build" does not exist in the project

Opened this issue · 8 comments

On MacOS the initial build.sh fails with this:

/usr/local/Cellar/mono/6.0.0.319/lib/mono/msbuild/15.0/bin/MSBuild.dll /bl:/var/folders/r1/xm_0s3y11td6zwk4mx8nplrw0000gn/T/tmpixxlW5.tmp.binlog /p:RestorePackages=False /p:Optimize=True /p:DebugSymbols=True /p:Configuration=Release /t:Build /v:q MyProject.sln
/Users/alex/Projects/MyProject/src/MyProject/MyProject.fsproj : error MSB4057: The target "Build" does not exist in the project.
/Users/alex/Projects/MyProject/src/MyProject/MyProject.fsproj : error MSB4057: The target "Build" does not exist in the project.
/Users/alex/Projects/MyProject/src/MyProject/MyProject.fsproj : error MSB4057: The target "Build" does not exist in the project.
/Users/alex/Projects/MyProject/src/MyProjectConsole/MyProjectConsole.fsproj : error MSB4057: The target "Build" does not exist in the project.
/Users/alex/Projects/MyProject/src/MyProjectConsole/MyProjectConsole.fsproj : error MSB4057: The target "Build" does not exist in the project.
: /Users/alex/Projects/MyProject/src/MyProject/MyProject.fsproj(0,0): error MSB4057: The target "Build" does not exist in the project.
: /Users/alex/Projects/MyProject/src/MyProjectConsole/MyProjectConsole.fsproj(0,0): error MSB4057: The target "Build" does not exist in the project.
Finished (Failed) 'MSBuild' in 00:00:02.1028417
Finished (Failed) 'Build' in 00:00:02.1050855

To found the issue, you can created your own Build-target to the fsproj-file first:

<Target Name="Build">
	<Message Text="Ext = $(MSBuildExtensionsPath)" />
	<Message Text="Tools = $(MSBuildToolsVersion)" />
	<Message Text="msb32 = $(MSBuildExtensionsPath32)" />
	<Message Text="targ = $(TargetFrameworkIdentifier)" />
	<Message Text="fs = $(FSharpTargetsPath)" />
	<Message Text="vs = $(VisualStudioVersion)" />
</Target>  

The issue is probably that there is a condition saying something like

  <PropertyGroup Condition="'$(VisualStudioVersion)' != '11.0'">
    <FSharpTargetsPath>$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets</FSharpTargetsPath>
  </PropertyGroup>

but with recent Visual Studio the condition is not met or the path is actually somewhere else,
like in VisualStudio\v$(MSBuildToolsVersion)\FSharp\ and not in VisualStudio\v$(VisualStudioVersion)\FSharp\ so as a quick fix
you can fallback it to something else like

  <PropertyGroup Condition="'$(VisualStudioVersion)' != '11.0' And Exists('$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\')">
    <FSharpTargetsPath>$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets</FSharpTargetsPath>
  </PropertyGroup>
  <PropertyGroup Condition="'$(VisualStudioVersion)' != '11.0' And Exists('$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(MSBuildToolsVersion)\FSharp\')">
    <FSharpTargetsPath>$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(MSBuildToolsVersion)\FSharp\Microsoft.FSharp.Targets</FSharpTargetsPath>
  </PropertyGroup>  

Second this - a fresh pull of the project, ran once to enter project details and then ./build.sh (windows, git) gives output below

RUnning

$ dotnet --info
.NET Core SDK (reflecting any global.json):
 Version:   3.1.201
 Commit:    b1768b4ae7

Runtime Environment:
 OS Name:     Windows
 OS Version:  10.0.18363
 OS Platform: Windows
 RID:         win10-x64
 Base Path:   C:\Program Files\dotnet\sdk\3.1.201\

Host (useful for support):
  Version: 3.1.3
  Commit:  4a9f85e9f8

.NET Core SDKs installed:
  2.2.401 [C:\Program Files\dotnet\sdk]
  3.0.100 [C:\Program Files\dotnet\sdk]
  3.1.100 [C:\Program Files\dotnet\sdk]
  3.1.201 [C:\Program Files\dotnet\sdk]

.NET Core runtimes installed:
  Microsoft.AspNetCore.All 2.1.17 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All]
  Microsoft.AspNetCore.All 2.2.6 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All]
  Microsoft.AspNetCore.App 2.1.17 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 2.2.6 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 3.0.0 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 3.1.0 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 3.1.3 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.NETCore.App 2.1.17 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 2.2.6 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 3.0.0 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 3.1.0 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 3.1.3 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.WindowsDesktop.App 3.0.0 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
  Microsoft.WindowsDesktop.App 3.1.0 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
  Microsoft.WindowsDesktop.App 3.1.3 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
$ ./build.sh
  Restore completed in 26.94 ms for C:\extproj\ProjectScaffold\build.proj.
  Restore completed in 30.53 ms for C:\extproj\ProjectScaffold\build.proj.
The last restore is still up to date. Nothing left to do.
run All
Building project with version: LocalBuild
Shortened DependencyGraph for Target All:
<== All
   <== NuGet
      <== GenerateDocs
         <== RunTests
            <== CopyBinaries
               <== Build
                  <== Restore
                     <== AssemblyInfo
                        <== Clean
         <== ReferenceDocs
            <== Docs
               <== CleanDocs

The running order is:
Group - 1
  - Clean
Group - 2
  - AssemblyInfo
Group - 3
  - Restore
Group - 4
  - Build
Group - 5
  - CopyBinaries
Group - 6
  - RunTests
Group - 7
  - CleanDocs
Group - 8
  - Docs
Group - 9
  - ReferenceDocs
Group - 10
  - GenerateDocs
Group - 11
  - NuGet
Group - 12
  - All
Starting target 'Clean'
Finished (Success) 'Clean' in 00:00:00.0071921
Starting target 'AssemblyInfo'
Finished (Success) 'AssemblyInfo' in 00:00:00.0462503
Starting target 'Restore'
Starting task 'DotNet:restore': fss.sln
If you encounter msbuild errors make sure you have copied the required SDKs, see https://github.com/Microsoft/msbuild/issues/1697
C:\extproj\ProjectScaffold> "C:\Program Files\dotnet\dotnet.EXE" msbuild /version /nologo (In: false, Out: true, Err: true)
16.5.0.12403
C:\extproj\ProjectScaffold> "C:\Program Files\dotnet\dotnet.EXE" restore fss.sln /nodeReuse:False "/bl:C:\Users\daz\AppData\Local\Temp\tmpB8B5.tmp.binlog" (In: false, Out: false, Err: false)
C:\Program Files\dotnet\sdk\3.1.201\MSBuild.dll -nologo -distributedlogger:Microsoft.DotNet.Tools.MSBuild.MSBuildLogger,C:\Program Files\dotnet\sdk\3.1.201\dotnet.dll*Microsoft.DotNet.Tools.MSBuild.MSBuildForwardingLogger,C:\Program Files\dotnet\sdk\3.1.201\dotnet.dll -maxcpucount -target:Restore -verbosity:m /bl:C:\Users\daz\AppData\Local\Temp\tmpB8B5.tmp.binlog /nodeReuse:False fss.sln
  Restore completed in 45.27 ms for C:\extproj\ProjectScaffold\tests\fss.Tests\fss.Tests.fsproj.
  Restore completed in 44.09 ms for C:\extproj\ProjectScaffold\src\fssConsole\fssConsole.fsproj.
  Restore completed in 44.09 ms for C:\extproj\ProjectScaffold\src\fss\fss.fsproj.
Finished (Success) 'DotNet:restore' in 00:00:02.5443836
Finished (Success) 'Restore' in 00:00:02.5454715
Starting target 'Build'
Starting task 'MSBuild': fss.sln
> "C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\MSBuild\Current\Bin\MSBuild.exe" /version /nologo (In: false, Out: true, Err: true)
C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\MSBuild\Current\Bin\MSBuild.exe fss.sln /t:Build /m /nodeReuse:False /v:q /p:RestorePackages=False /p:Optimize=True /p:DebugSymbols=True /p:Configuration=Release "/bl:C:\Users\daz\AppData\Local\Temp\tmpC27A.tmp.binlog"
C:\extproj\ProjectScaffold> "C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\MSBuild\Current\Bin\MSBuild.exe" fss.sln /t:Build /m /nodeReuse:False /v:q /p:RestorePackages=False /p:Optimize=True /p:DebugSymbols=True /p:Configuration=Release "/bl:C:\Users\daz\AppData\Local\Temp\tmpC27A.tmp.binlog" (In: false, Out: false, Err: false)
Microsoft (R) Build Engine version 16.5.0+d4cbfca49 for .NET Framework
Copyright (C) Microsoft Corporation. All rights reserved.

C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\MSBuild\Current\Bin\MSBuild.exe /bl:C:\Users\daz\AppData\Local\Temp\tmpC27A.tmp.binlog /m /nodeReuse:False /p:RestorePackages=False /p:Optimize=True /p:DebugSymbols=True /p:Configuration=Release /t:Build /v:q fss.sln
C:\extproj\ProjectScaffold\src\fss\fss.fsproj : error MSB4057: The target "Build" does not exist in the project.
C:\extproj\ProjectScaffold\src\fssConsole\fssConsole.fsproj : error MSB4057: The target "Build" does not exist in the project.
C:\extproj\ProjectScaffold\src\fssConsole\fssConsole.fsproj : error MSB4057: The target "Build" does not exist in the project.
C:\extproj\ProjectScaffold\src\fss\fss.fsproj : error MSB4057: The target "Build" does not exist in the project.
C:\extproj\ProjectScaffold\src\fss\fss.fsproj : error MSB4057: The target "Build" does not exist in the project.
: C:\extproj\ProjectScaffold\src\fss\fss.fsproj(0,0): error MSB4057: The target "Build" does not exist in the project.
: C:\extproj\ProjectScaffold\src\fssConsole\fssConsole.fsproj(0,0): error MSB4057: The target "Build" does not exist in the project.
Finished (Failed) 'MSBuild' in 00:00:01.0206622
Finished (Failed) 'Build' in 00:00:01.0223196

---------------------------------------------------------------------
Build Time Report
---------------------------------------------------------------------
Target          Duration
------          --------
Clean           00:00:00.0032040
AssemblyInfo    00:00:00.0461958
Restore         00:00:02.5453931
Build           00:00:01.0222261   (Exception of type 'Fake.DotNet.MSBuildException' was thrown.)
CopyBinaries    00:00:00           (skipped)
RunTests        00:00:00           (skipped)
CleanDocs       00:00:00           (skipped)
Docs            00:00:00           (skipped)
ReferenceDocs   00:00:00           (skipped)
GenerateDocs    00:00:00           (skipped)
NuGet           00:00:00           (skipped)
All             00:00:00           (skipped)
Total:          00:00:03.7738034
Status:         Failure
---------------------------------------------------------------------
Script reported an error:
-> BuildFailedException: Target 'Build' failed.
-> One or more errors occurred. (Exception of type 'Fake.DotNet.MSBuildException' was thrown.)
-> MSBuildException: Exception of type 'Fake.DotNet.MSBuildException' was thrown.
Hint: To further diagnose the problem you can run fake in verbose mode `fake -v run ...` or set the 'FAKE_DETAILED_ERRORS' environment variable to 'true'
Hint: Could not find a version in your paket.dependencies file, consider adding 'version 5.245.1' at the top of your dependencies file (C:\extproj\ProjectScaffold\paket.dependencies).
Read https://github.com/fsharp/FAKE/issues/2193 for details.
Performance:
 - Cli parsing: 277 milliseconds
 - Packages: 206 milliseconds
 - Script analyzing: 75 milliseconds
 - Script running: 3 seconds
 - Script cleanup: 9 milliseconds
 - Runtime: 6 seconds

As a workaround, there is commented out section of the build target in the generated template. If you uncomment that, and comment out the active portion like so, it seems to work. Suggest fixing the template to use the commented out version? Not sure why it's like that. Happy to send a PR if people agree that's preferable? Looking at it, it seems like the dotnet build process is working for me but not the MSBuild call. Your experience might vary depending on which SDK you have installed. My 2020 motto is torch .Netxxx support - it's holding everyone back at this point, but YMMV.

Target.create "Build" (fun _ ->
    solutionFile
    |> DotNet.build (fun p ->
        { p with
            Configuration = buildConfiguration })
    (*

    let setParams (defaults:MSBuildParams) =
        { defaults with
            Verbosity = Some(Quiet)
            Targets = ["Build"]
            Properties =
                [
                    "Optimize", "True"
                    "DebugSymbols", "True"
                    "Configuration", configuration
                ]
         }
    MSBuild.build setParams solutionFile
    *)
)```

I don't think this project is maintained any more - I'd recommend using https://github.com/TheAngryByrd/MiniScaffold or https://github.com/ionide/Waypoint instead.

Hey, @forki maybe we should somehow formalize that by putting huge info in the readme?

That's too bad - was trying to upgrade an old project based on this and hoping I could drop a fresh checkout onto the old one. That's part of the problem with using scaffolds etc - it's a fast way to get started but you kind of get locked in to the infrastructure. Right now the project and tests themselves build with just vanilla dotnet tooling but all the other housekeeping like release notes, and packaging and docs depend on getting some now spider web encrusted scripts updated.

Or perhaps revamp this project?

Looks like there hasn't been any accepted pull requests in a while, so let's ask about in the f# projects channel.