hoffi/gulp-msbuild

Fails to locate correct MSBuild when building database project using SSDT for VS 2017

Closed this issue · 4 comments

My team is migrating to gulp and we are trying to build database project on our build agent using SSDT tools for visual studio 2017. The agent is clean (no vs), only build tools and SSDT tools are installed:

Using the following gulp task:

var gulp = require('gulp');
var msbuild = require("gulp-msbuild");

gulp.task("DW-database-build", function () {
	return gulp.src("../Database/Database.sqlproj")
		.pipe(
			msbuild({
				targets: ['Clean', 'Build'],
				toolsVersion: 15.0,
				maxcpucount: 4,
				verbosity: "quiet",
				nodeReuse: false,
				properties: {
					Configuration: 'Release',
					VisualStudioVersion: '15.0',
					Platform: 'AnyCPU'
				}
			})
		);
});

gulp uses msbuild located in BuilTools folder which fails to locate SSDT

Build started 25.9.2017 14:09:40.
     0>Search paths being used for $(MSBuildExtensionsPath) are C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild;$(MSBuildProgramFiles32)\MSBuild
       Trying to import C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\$(MSBuildToolsVersion)\Microsoft.Common.props using extensions path C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild
       Property reassignment: $(MSBuildProjectExtensionsPath)="C:\TeamCity\buildAgent\work\DWX_CI\Database\obj\" (previous value: "obj\") at C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Microsoft.Common.props (58,5)
       Search paths being used for $(MSBuildExtensionsPath) are C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild;$(MSBuildProgramFiles32)\MSBuild
       Trying to import C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\$(MSBuildToolsVersion)\Imports\Microsoft.Common.props\ImportBefore\* using extensions path C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild
       Search paths being used for $(MSBuildExtensionsPath) are C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild;$(MSBuildProgramFiles32)\MSBuild
       Search paths being used for $(MSBuildExtensionsPath) are C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild;$(MSBuildProgramFiles32)\MSBuild
       Search paths being used for $(MSBuildExtensionsPath) are C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild;$(MSBuildProgramFiles32)\MSBuild
       Search paths being used for $(MSBuildExtensionsPath) are C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild;$(MSBuildProgramFiles32)\MSBuild
       Trying to import C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\Microsoft\VisualStudio\v$(VisualStudioVersion)\SSDT\Microsoft.Data.Tools.Schema.SqlTasks.targets using extensions path C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild
       Trying to import C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v$(VisualStudioVersion)\SSDT\Microsoft.Data.Tools.Schema.SqlTasks.targets using extensions path C:\Program Files (x86)\MSBuild
     1>Project "C:\TeamCity\buildAgent\work\DWX_CI\Database\Database.sqlproj" on node 1 (Clean;Build target(s)).
     1>Building with tools version "15.0".
     1>C:\TeamCity\buildAgent\work\DWX_CI\Database\Database.sqlproj(66,57): error MSB4226: The imported project "C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\Microsoft\VisualStudio\v15.0\SSDT\Microsoft.Data.Tools.Schema.SqlTasks.targets" was not found. Also, tried to find "Microsoft\VisualStudio\v15.0\SSDT\Microsoft.Data.Tools.Schema.SqlTasks.targets" in the fallback search path(s) for $(MSBuildExtensionsPath) - "C:\Program Files (x86)\MSBuild" . These search paths are defined in "C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin\amd64\MSBuild.exe.Config". Confirm that the path in the <Import> declaration is correct, and that the file exists on disk in one of the search paths.
     1>Done Building Project "C:\TeamCity\buildAgent\work\DWX_CI\Database\Database.sqlproj" (Clean;Build target(s)) -- FAILED.

Build FAILED.

       "C:\TeamCity\buildAgent\work\DWX_CI\Database\Database.sqlproj" (Clean;Build target) (1) ->
         C:\TeamCity\buildAgent\work\DWX_CI\Database\Database.sqlproj(66,57): error MSB4226: The imported project "C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\Microsoft\VisualStudio\v15.0\SSDT\Microsoft.Data.Tools.Schema.SqlTasks.targets" was not found. Also, tried to find "Microsoft\VisualStudio\v15.0\SSDT\Microsoft.Data.Tools.Schema.SqlTasks.targets" in the fallback search path(s) for $(MSBuildExtensionsPath) - "C:\Program Files (x86)\MSBuild" . These search paths are defined in "C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin\amd64\MSBuild.exe.Config". Confirm that the path in the <Import> declaration is correct, and that the file exists on disk in one of the search paths.

    0 Warning(s)
    1 Error(s)

Time Elapsed 00:00:00.30

The path "C:\Program Files (x86)\Microsoft Visual Studio\2017" contains two folders 'BuildTools' and 'SQL'. SQL folder was created by SSDT installer and as expected it contains SSDT tools. Manually using msbuild located in SQL folder correctly builds the database project.

Before migrating to gulp, we used grunt with grunt-msbuild plugin. Inernally it uses vswhere utility which correctly used msbuild from SQL folder.

I noticed that msbuild-finder.js only looks in

var possibleFolders = ['BuildTools', 'Enterprise', 'Professional', 'Community'];
hoffi commented

Hi,

gulp-msbuild also uses vswhere first and only falls back to the possibleFolders if it doesn't find anything. (See here and here).

I've looked into grunt-msbuild and found that they are calling vswhere with some parameters.

Could you post the output of these two commands? Maybe it is resolved correctly with the parameters:

  • %ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe
  • %ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe -latest -products * -requires Microsoft.Component.MSBuild

Hi,

output:

  • %ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe

Visual Studio Locator version 2.0.2 [query version 1.11.2331.64267]
Copyright (C) Microsoft Corporation. All rights reserved.

  • %ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe -latest -products * -requires Microsoft.Component.MSBuild

Visual Studio Locator version 2.0.2 [query version 1.11.2331.64267]
Copyright (C) Microsoft Corporation. All rights reserved.

instanceId: 7d2c474b
installDate: 20.9.2017
installationName: VisualStudio/15.3.5+26730.16
installationPath: C:\Program Files (x86)\Microsoft Visual Studio\2017\SQL
installationVersion: 15.3.26730.16
isPrerelease: 0
displayName: Microsoft SQL Server Data Tools for Visual Studio 2017
description: Microsoft SQL Server Data Tools for Visual Studio 2017
enginePath: C:\Program Files (x86)\Microsoft Visual Studio\Installer\resources\app\ServiceHub\Services\Microsoft.VisualStudio.Setup.Service
channelId: VisualStudio.15.Release
channelPath: C:\Users\svc_bts_build\AppData\Local\Microsoft\VisualStudio\Packages_Channels\4CB340F5\catalog.json
channelUri: https://aka.ms/vs/15/release/channel
releaseNotes: https://go.microsoft.com/fwlink/?LinkId=660469#15.3.26730.16
thirdPartyNotices: https://go.microsoft.com/fwlink/?LinkId=660485

hoffi commented

Huh, thanks!
I will add these parameters 👍

hoffi commented

Hi, i have published a new version with this fix.