Skip to content
This repository has been archived by the owner on Aug 19, 2019. It is now read-only.

Commit

Permalink
Search Enterprise, Professional, Community then BuildTools folders fo…
Browse files Browse the repository at this point in the history
…r ms build. Cover this logic properly.
  • Loading branch information
Adam Surgenor committed Feb 10, 2017
1 parent d377a97 commit e8cb2a2
Show file tree
Hide file tree
Showing 2 changed files with 190 additions and 22 deletions.
20 changes: 12 additions & 8 deletions lib/msbuild-finder.js
Expand Up @@ -65,14 +65,18 @@ module.exports.find = function (options) {
var x64_dir = is64Bit ? 'amd64' : '';
var msbuildRoot = pathRoot

if(version === '15.0')
{
msbuildRoot = path.join(pathRoot, 'Microsoft Visual Studio','2017','Professional');
try {
fs.statSync(pathRoot);
} catch (e) {
msbuildRoot = path.join(pathRoot, 'Microsoft Visual Studio','2017','BuildTools');
}
if(version === '15.0') {
var foundFolder = ['Enterprise', 'Professional', 'Community', 'BuildTools']
.find(function(folder) {
try {
fs.statSync(path.join(pathRoot, 'Microsoft Visual Studio','2017',folder));
return true;
} catch (e) {
return false;
}});
var msbuildRoot = foundFolder
? path.join(pathRoot, 'Microsoft Visual Studio','2017',foundFolder)
: pathRoot;
}

return path.join(msbuildRoot, 'MSBuild', version, 'Bin', x64_dir, 'MSBuild.exe');
Expand Down
192 changes: 178 additions & 14 deletions test/msbuild-finder.js
Expand Up @@ -13,6 +13,8 @@ require('mocha-sinon');
var msbuildFinder = require('../lib/msbuild-finder');

describe('msbuild-finder', function () {
var fs = require('fs');
var mock;

it('should use xbuild on linux', function () {
var result = msbuildFinder.find({ platform: 'linux' });
Expand Down Expand Up @@ -113,39 +115,201 @@ describe('msbuild-finder', function () {
expect(result).to.be.equal(expectedResult);
});

it('should use msbuild 15 on windows with visual studio 2017 project', function () {
it('should use visual studio enterprise msbuild 15 on windows with visual studio 2017 project and visual studio enterprise installed', function () {
var toolsVersion = 15.0;
var expectMSBuildVersion = constants.MSBUILD_VERSIONS[toolsVersion];

var pathRoot = process.env['ProgramFiles'] || path.join('C:', 'Program Files');
var vsEnterprisePath = path.join(pathRoot, 'Microsoft Visual Studio','2017','Enterprise');
var expectedResult = path.join(vsEnterprisePath, 'MSBuild', '15.0', 'Bin', 'MSBuild.exe');

var mock = this.sinon.mock(fs);
mock.expects('statSync').withArgs(vsEnterprisePath).returns({});

var result = msbuildFinder.find({ platform: 'win32', toolsVersion: toolsVersion, architecture: 'x86' });

expect(result).to.be.equal(expectedResult);
});

it('should use visual studio enterprise 64bit msbuild 15 on windows x64 with visual studio 2017 project and visual studio enterprise installed', function () {
var toolsVersion = 15.0;
var expectMSBuildVersion = constants.MSBUILD_VERSIONS[toolsVersion];

var pathRoot = process.env['ProgramFiles(x86)'] || path.join('C:', 'Program Files (x86)');
var vsEnterprisePath = path.join(pathRoot, 'Microsoft Visual Studio','2017','Enterprise');
var expectedResult = path.join(vsEnterprisePath, 'MSBuild', '15.0', 'Bin/amd64', 'MSBuild.exe');

var mock = this.sinon.mock(fs);
mock.expects('statSync').withArgs(vsEnterprisePath).returns({});

var result = msbuildFinder.find({ platform: 'win32', toolsVersion: toolsVersion, architecture: 'x64' });

expect(result).to.be.equal(expectedResult);
});

it('should use visual studio professional msbuild 15 on windows with visual studio 2017 project and visual studio professional installed', function () {
var toolsVersion = 15.0;
var expectMSBuildVersion = constants.MSBUILD_VERSIONS[toolsVersion];

var pathRoot = process.env['ProgramFiles'] || path.join('C:', 'Program Files');
var expectedResult = path.join(pathRoot, 'Microsoft Visual Studio','2017','Professional', 'MSBuild', expectMSBuildVersion, 'Bin', 'MSBuild.exe');
try {
fs.statSync(pathRoot);
} catch (e) {
expectedResult = path.join(pathRoot, 'Microsoft Visual Studio','2017','BuildTools', 'MSBuild', expectMSBuildVersion, 'Bin', 'MSBuild.exe');
}
var vsEnterprisePath = path.join(pathRoot, 'Microsoft Visual Studio','2017','Enterprise');
var vsProfessionalPath = path.join(pathRoot, 'Microsoft Visual Studio','2017','Professional');
var expectedResult = path.join(vsProfessionalPath, 'MSBuild', '15.0', 'Bin', 'MSBuild.exe');

var mock = this.sinon.mock(fs);
mock.expects('statSync').withArgs(vsEnterprisePath).throws();
mock.expects('statSync').withArgs(vsProfessionalPath).returns({});

var result = msbuildFinder.find({ platform: 'win32', toolsVersion: toolsVersion, architecture: 'x86' });

expect(result).to.be.equal(expectedResult);
});

it('should use visual studio professional 64bit msbuild 15 on windows x64 with visual studio 2017 project and visual studio professional installed', function () {
var toolsVersion = 15.0;
var expectMSBuildVersion = constants.MSBUILD_VERSIONS[toolsVersion];

var pathRoot = process.env['ProgramFiles(x86)'] || path.join('C:', 'Program Files (x86)');
var vsEnterprisePath = path.join(pathRoot, 'Microsoft Visual Studio','2017','Enterprise');
var vsProfessionalPath = path.join(pathRoot, 'Microsoft Visual Studio','2017','Professional');
var expectedResult = path.join(vsProfessionalPath, 'MSBuild', '15.0', 'Bin/amd64', 'MSBuild.exe');

var mock = this.sinon.mock(fs);
mock.expects('statSync').withArgs(vsEnterprisePath).throws();
mock.expects('statSync').withArgs(vsProfessionalPath).returns({});

var result = msbuildFinder.find({ platform: 'win32', toolsVersion: toolsVersion, architecture: 'x64' });

expect(result).to.be.equal(expectedResult);
});

it('should use visual studio community msbuild 15 on windows with visual studio 2017 project and visual studio community installed', function () {
var toolsVersion = 15.0;
var expectMSBuildVersion = constants.MSBUILD_VERSIONS[toolsVersion];

var pathRoot = process.env['ProgramFiles'] || path.join('C:', 'Program Files');
var vsEnterprisePath = path.join(pathRoot, 'Microsoft Visual Studio','2017','Enterprise');
var vsProfessionalPath = path.join(pathRoot, 'Microsoft Visual Studio','2017','Professional');
var vsCommunityPath = path.join(pathRoot, 'Microsoft Visual Studio','2017','Community');
var expectedResult = path.join(vsCommunityPath, 'MSBuild', '15.0', 'Bin', 'MSBuild.exe');

var mock = this.sinon.mock(fs);
mock.expects('statSync').withArgs(vsEnterprisePath).throws();
mock.expects('statSync').withArgs(vsProfessionalPath).throws();
mock.expects('statSync').withArgs(vsCommunityPath).returns({});

var result = msbuildFinder.find({ platform: 'win32', toolsVersion: toolsVersion, architecture: 'x86' });

expect(result).to.be.equal(expectedResult);
});

it('should use 64bit msbuild 15 on windows x64 with visual studio 2017 project', function () {
it('should use visual studio community 64bit msbuild 15 on windows x64 with visual studio 2017 project and visual studio community installed', function () {
var toolsVersion = 15.0;
var expectMSBuildVersion = constants.MSBUILD_VERSIONS[toolsVersion];

var pathRoot = process.env['ProgramFiles(x86)'] || path.join('C:', 'Program Files (x86)');
var vsEnterprisePath = path.join(pathRoot, 'Microsoft Visual Studio','2017','Enterprise');
var vsProfessionalPath = path.join(pathRoot, 'Microsoft Visual Studio','2017','Professional');
var vsCommunityPath = path.join(pathRoot, 'Microsoft Visual Studio','2017','Community');
var expectedResult = path.join(vsCommunityPath, 'MSBuild', '15.0', 'Bin/amd64', 'MSBuild.exe');

var mock = this.sinon.mock(fs);
mock.expects('statSync').withArgs(vsEnterprisePath).throws();
mock.expects('statSync').withArgs(vsProfessionalPath).throws();
mock.expects('statSync').withArgs(vsCommunityPath).returns({});

var result = msbuildFinder.find({ platform: 'win32', toolsVersion: toolsVersion, architecture: 'x64' });

expect(result).to.be.equal(expectedResult);
});

it('should use visual studio build tools msbuild 15 on windows with visual studio 2017 project and visual studio build tools installed', function () {
var toolsVersion = 15.0;
var expectMSBuildVersion = constants.MSBUILD_VERSIONS[toolsVersion];

var pathRoot = process.env['ProgramFiles'] || path.join('C:', 'Program Files');
var vsEnterprisePath = path.join(pathRoot, 'Microsoft Visual Studio','2017','Enterprise');
var vsProfessionalPath = path.join(pathRoot, 'Microsoft Visual Studio','2017','Professional');
var vsCommunityPath = path.join(pathRoot, 'Microsoft Visual Studio','2017','Community');
var vsBuildToolsPath = path.join(pathRoot, 'Microsoft Visual Studio','2017','BuildTools');
var expectedResult = path.join(vsBuildToolsPath, 'MSBuild', '15.0', 'Bin', 'MSBuild.exe');

var mock = this.sinon.mock(fs);
mock.expects('statSync').withArgs(vsEnterprisePath).throws();
mock.expects('statSync').withArgs(vsProfessionalPath).throws();
mock.expects('statSync').withArgs(vsCommunityPath).throws();
mock.expects('statSync').withArgs(vsBuildToolsPath).returns({});

var result = msbuildFinder.find({ platform: 'win32', toolsVersion: toolsVersion, architecture: 'x86' });

expect(result).to.be.equal(expectedResult);
});

it('should use visual studio build tools 64bit msbuild 15 on windows x64 with visual studio 2017 project and visual studio build tools installed', function () {
var toolsVersion = 15.0;
var expectMSBuildVersion = constants.MSBUILD_VERSIONS[toolsVersion];

var pathRoot = process.env['ProgramFiles(x86)'] || path.join('C:', 'Program Files (x86)');
var expectedResult = path.join(pathRoot, 'Microsoft Visual Studio','2017','Professional', 'MSBuild', expectMSBuildVersion, 'Bin/amd64', 'MSBuild.exe');
try {
fs.statSync(pathRoot);
} catch (e) {
expectedResult = path.join(pathRoot, 'Microsoft Visual Studio','2017','BuildTools', 'MSBuild', expectMSBuildVersion, 'Bin/amd64', 'MSBuild.exe');
}
var vsEnterprisePath = path.join(pathRoot, 'Microsoft Visual Studio','2017','Enterprise');
var vsProfessionalPath = path.join(pathRoot, 'Microsoft Visual Studio','2017','Professional');
var vsCommunityPath = path.join(pathRoot, 'Microsoft Visual Studio','2017','Community');
var vsBuildToolsPath = path.join(pathRoot, 'Microsoft Visual Studio','2017','BuildTools');
var expectedResult = path.join(vsBuildToolsPath, 'MSBuild', '15.0', 'Bin/amd64', 'MSBuild.exe');

var mock = this.sinon.mock(fs);
mock.expects('statSync').withArgs(vsEnterprisePath).throws();
mock.expects('statSync').withArgs(vsProfessionalPath).throws();
mock.expects('statSync').withArgs(vsCommunityPath).throws();
mock.expects('statSync').withArgs(vsBuildToolsPath).returns({});

var result = msbuildFinder.find({ platform: 'win32', toolsVersion: toolsVersion, architecture: 'x64' });

expect(result).to.be.equal(expectedResult);
});

it('should fall back to legacy build path on windows with visual studio 2017 project and visual studio is not installed', function () {
var toolsVersion = 15.0;
var expectMSBuildVersion = constants.MSBUILD_VERSIONS[toolsVersion];

var pathRoot = process.env['ProgramFiles'] || path.join('C:', 'Program Files');
var vsEnterprisePath = path.join(pathRoot, 'Microsoft Visual Studio','2017','Enterprise');
var vsProfessionalPath = path.join(pathRoot, 'Microsoft Visual Studio','2017','Professional');
var vsCommunityPath = path.join(pathRoot, 'Microsoft Visual Studio','2017','Community');
var vsBuildToolsPath = path.join(pathRoot, 'Microsoft Visual Studio','2017','BuildTools');
var expectedResult = path.join(pathRoot, 'MSBuild', '15.0', 'Bin', 'MSBuild.exe');

var mock = this.sinon.mock(fs);
mock.expects('statSync').withArgs(vsEnterprisePath).throws();
mock.expects('statSync').withArgs(vsProfessionalPath).throws();
mock.expects('statSync').withArgs(vsCommunityPath).throws();
mock.expects('statSync').withArgs(vsBuildToolsPath).throws();

var result = msbuildFinder.find({ platform: 'win32', toolsVersion: toolsVersion, architecture: 'x86' });

expect(result).to.be.equal(expectedResult);
});

it('should fall back to legacy build path on windows x64 with visual studio 2017 project and visual studio is not installed', function () {
var toolsVersion = 15.0;
var expectMSBuildVersion = constants.MSBUILD_VERSIONS[toolsVersion];

var pathRoot = process.env['ProgramFiles(x86)'] || path.join('C:', 'Program Files (x86)');
var vsEnterprisePath = path.join(pathRoot, 'Microsoft Visual Studio','2017','Enterprise');
var vsProfessionalPath = path.join(pathRoot, 'Microsoft Visual Studio','2017','Professional');
var vsCommunityPath = path.join(pathRoot, 'Microsoft Visual Studio','2017','Community');
var vsBuildToolsPath = path.join(pathRoot, 'Microsoft Visual Studio','2017','BuildTools');
var expectedResult = path.join(pathRoot, 'MSBuild', '15.0', 'Bin/amd64', 'MSBuild.exe');

var mock = this.sinon.mock(fs);
mock.expects('statSync').withArgs(vsEnterprisePath).throws();
mock.expects('statSync').withArgs(vsProfessionalPath).throws();
mock.expects('statSync').withArgs(vsCommunityPath).throws();
mock.expects('statSync').withArgs(vsBuildToolsPath).throws();

var result = msbuildFinder.find({ platform: 'win32', toolsVersion: toolsVersion, architecture: 'x64' });

expect(result).to.be.equal(expectedResult);
});

it('should throw error with invalid toolsVersion', function () {
var func = function () {
Expand Down

0 comments on commit e8cb2a2

Please sign in to comment.