You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by an...@apache.org on 2016/07/08 13:34:05 UTC

cordova-windows git commit: CB-11548 windows: Respect user-specified msbuild location

Repository: cordova-windows
Updated Branches:
  refs/heads/master b0502ae45 -> e22e51e58


CB-11548 windows: Respect user-specified msbuild location

This closes #184


Project: http://git-wip-us.apache.org/repos/asf/cordova-windows/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-windows/commit/e22e51e5
Tree: http://git-wip-us.apache.org/repos/asf/cordova-windows/tree/e22e51e5
Diff: http://git-wip-us.apache.org/repos/asf/cordova-windows/diff/e22e51e5

Branch: refs/heads/master
Commit: e22e51e588c9303b7b338d9fa9ea266ab824a14f
Parents: b0502ae
Author: Vladimir Kotikov <v-...@microsoft.com>
Authored: Thu Jun 30 09:30:03 2016 +0200
Committer: Vladimir Kotikov <v-...@microsoft.com>
Committed: Fri Jul 8 16:15:53 2016 +0300

----------------------------------------------------------------------
 spec/unit/MSBuildTools.spec.js       | 51 +++++++++++++++++++++++++--
 spec/unit/build.spec.js              | 57 ++++++++++++++++++++-----------
 template/cordova/lib/MSBuildTools.js | 22 +++++++++++-
 template/cordova/lib/build.js        | 27 ++++++++++++---
 4 files changed, 129 insertions(+), 28 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-windows/blob/e22e51e5/spec/unit/MSBuildTools.spec.js
----------------------------------------------------------------------
diff --git a/spec/unit/MSBuildTools.spec.js b/spec/unit/MSBuildTools.spec.js
index 4850946..442479b 100644
--- a/spec/unit/MSBuildTools.spec.js
+++ b/spec/unit/MSBuildTools.spec.js
@@ -21,6 +21,7 @@ var shell = require('shelljs');
 var rewire = require('rewire');
 var platformRoot = '../../template';
 var buildTools = rewire(platformRoot + '/cordova/lib/MSBuildTools.js');
+var MSBuildTools = buildTools.__get__('MSBuildTools');
 var Version = require(platformRoot + '/cordova/lib/Version.js');
 
 var fakeToolsPath = function (version) {
@@ -134,8 +135,6 @@ describe('checkMSBuildVersion method', function(){
 });
 
 describe('MSBuildTools object', function(){
-    var MSBuildTools = buildTools.__get__('MSBuildTools');
-
     it('spec.9 should have fields and methods defined', function() {
         var version   = '14.0',
             toolsPath = fakeToolsPath(version),
@@ -200,3 +199,51 @@ describe('getAvailableUAPVersions method', function(){
         });
     });
 });
+
+describe('getMSBuildToolsAt method', function () {
+
+    var fakePath = '/some/fake/path';
+    var messyPath = '/another/fake/path';
+    var fakeVersion = '22.0.12635.5';
+    var fakeVersionParsed = '22.0';
+
+    var fail = jasmine.createSpy('fail');
+    var success = jasmine.createSpy('success');
+
+    var spawnOriginal = buildTools.__get__('spawn');
+    var spawnSpy = jasmine.createSpy('spawn');
+
+    beforeEach(function () {
+        buildTools.__set__('spawn', spawnSpy);
+    });
+
+    afterEach(function () {
+        buildTools.__set__('spawn', spawnOriginal);
+    });
+
+    it('should return MSBuildTools instance', function (done) {
+        spawnSpy.andReturn(Q(fakeVersion));
+
+        buildTools.getMSBuildToolsAt(fakePath)
+        .then(function (tools) {
+            expect(tools).toEqual(jasmine.any(MSBuildTools));
+            expect(tools.version).toBe(fakeVersionParsed);
+            expect(tools.path).toBe(fakePath);
+        }, fail)
+        .done(function () {
+            expect(fail).not.toHaveBeenCalled();
+            done();
+        });
+    });
+
+    it('should reject promise if no msbuild found', function (done) {
+        spawnSpy.andReturn(Q.reject());
+
+        buildTools.getMSBuildToolsAt(messyPath)
+        .then(success, fail)
+        .done(function () {
+            expect(success).not.toHaveBeenCalled();
+            done();
+        });
+    });
+});

http://git-wip-us.apache.org/repos/asf/cordova-windows/blob/e22e51e5/spec/unit/build.spec.js
----------------------------------------------------------------------
diff --git a/spec/unit/build.spec.js b/spec/unit/build.spec.js
index 96b1fac..396baa2 100644
--- a/spec/unit/build.spec.js
+++ b/spec/unit/build.spec.js
@@ -26,7 +26,9 @@ var Q = require('q'),
     build = rewire(platformRoot + '/cordova/lib/build.js');
 
 var utils = require(platformRoot + '/cordova/lib/utils');
+var package = require(platformRoot + '/cordova/lib/package');
 var AppxManifest = require(platformRoot + '/cordova/lib/AppxManifest');
+var MSBuildTools = require(platformRoot + '/cordova/lib/MSBuildTools');
 
 function createFindAvailableVersionMock(version, path, buildSpy) {
     build.__set__('MSBuildTools.findAvailableVersion', function() {
@@ -88,6 +90,7 @@ describe('run method', function() {
         spyOn(prepare, 'applyPlatformConfig');
         spyOn(prepare, 'addBOMSignature');
         spyOn(prepare, 'updateBuildConfig');
+        spyOn(package, 'getPackage').andReturn(Q({}));
 
         spyOn(AppxManifest, 'get').andReturn({
             getIdentity: function () {
@@ -119,34 +122,24 @@ describe('run method', function() {
         });
     });
 
-    it('spec.2 should reject if both debug and release args specified', function(done) {
-        var rejectSpy = jasmine.createSpy(),
-            buildSpy = jasmine.createSpy();
+    it('spec.2 should throw if both debug and release args specified', function() {
+        var buildSpy = jasmine.createSpy();
 
         createFindAvailableVersionMock('14.0', testPath, buildSpy);
 
-        build.run([ 'node', buildPath, '--release', '--debug' ])
-        .fail(rejectSpy)
-        .finally(function() {
-            expect(buildSpy).not.toHaveBeenCalled();
-            expect(rejectSpy).toHaveBeenCalled();
-            done();
-        });
+        expect(function () {
+            build.run({release: true, debug: true});
+        }).toThrow();
     });
 
-    it('spec.3 should reject if both phone and win args specified', function(done) {
-        var rejectSpy = jasmine.createSpy(),
-            buildSpy = jasmine.createSpy();
+    it('spec.3 should throw if both phone and win args specified', function() {
+        var buildSpy = jasmine.createSpy();
 
         createFindAvailableVersionMock('14.0', testPath, buildSpy);
 
-        build.run([ 'node', buildPath, '--phone', '--win' ])
-        .fail(rejectSpy)
-        .finally(function() {
-            expect(buildSpy).not.toHaveBeenCalled();
-            expect(rejectSpy).toHaveBeenCalled();
-            done();
-        });
+        expect(function () {
+            build.run({argv: [ '--phone', '--win' ]});
+        }).toThrow();
     });
 
     it('should respect build configuration from \'buildConfig\' option', function (done) {
@@ -357,4 +350,28 @@ describe('run method', function() {
             done();
         });
     });
+
+    it('spec.14 should use user-specified msbuild if VSINSTALLDIR variable is set', function (done) {
+        var customMSBuildPath = '/some/path';
+        var customMSBuildVersion = '15.0';
+        process.env.VSINSTALLDIR = customMSBuildPath;
+
+        spyOn(MSBuildTools, 'getMSBuildToolsAt')
+            .andReturn(Q({
+                path: customMSBuildPath,
+                version: customMSBuildVersion,
+                buildProject: jasmine.createSpy('buildProject').andReturn(Q())
+            }));
+
+        var fail = jasmine.createSpy('fail');
+
+        build.run({})
+        .fail(fail)
+        .finally(function() {
+            expect(fail).not.toHaveBeenCalled();
+            expect(MSBuildTools.getMSBuildToolsAt).toHaveBeenCalledWith(customMSBuildPath);
+            delete process.env.VSINSTALLDIR;
+            done();
+        });
+    });
 });

http://git-wip-us.apache.org/repos/asf/cordova-windows/blob/e22e51e5/template/cordova/lib/MSBuildTools.js
----------------------------------------------------------------------
diff --git a/template/cordova/lib/MSBuildTools.js b/template/cordova/lib/MSBuildTools.js
index 72208e8..1296f32 100644
--- a/template/cordova/lib/MSBuildTools.js
+++ b/template/cordova/lib/MSBuildTools.js
@@ -33,7 +33,7 @@ MSBuildTools.prototype.buildProject = function(projFile, buildType, buildarch, o
     events.emit('log', 'Building project: ' + projFile);
     events.emit('log', '\tConfiguration : ' + buildType);
     events.emit('log', '\tPlatform      : ' + buildarch);
-    
+
     var checkWinSDK = function (target_platform) {
         return require('./check_reqs').isWinSDKPresent(target_platform);
     };
@@ -95,6 +95,26 @@ module.exports.findAllAvailableVersions = function () {
     });
 };
 
+/**
+ * Gets MSBuildTools instance for user-specified location
+ *
+ * @param {String}  location  FS location where to search for MSBuild
+ * @returns  Promise<MSBuildTools>  The MSBuildTools instance at specified location
+ */
+function getMSBuildToolsAt(location) {
+    var msbuildExe = path.resolve(location, 'msbuild');
+
+    // TODO: can we account on these params availability and printed version format?
+    return spawn(msbuildExe, ['-version', '-nologo'])
+    .then(function (output) {
+        // MSBuild prints its' version as 14.0.25123.0, so we pick only first 2 segments
+        var version = output.match(/^(\d+\.\d+)/)[1];
+        return new MSBuildTools(version, location);
+    });
+}
+
+module.exports.getMSBuildToolsAt = getMSBuildToolsAt;
+
 function checkMSBuildVersion(version) {
     return spawn('reg', ['query', 'HKLM\\SOFTWARE\\Microsoft\\MSBuild\\ToolsVersions\\' + version, '/v', 'MSBuildToolsPath'])
     .then(function(output) {

http://git-wip-us.apache.org/repos/asf/cordova-windows/blob/e22e51e5/template/cordova/lib/build.js
----------------------------------------------------------------------
diff --git a/template/cordova/lib/build.js b/template/cordova/lib/build.js
index e389041..b69afa5 100644
--- a/template/cordova/lib/build.js
+++ b/template/cordova/lib/build.js
@@ -58,7 +58,23 @@ module.exports.run = function run (buildOptions) {
 
     var buildConfig = parseAndValidateArgs(buildOptions);
 
-    return MSBuildTools.findAllAvailableVersions()
+    return Q().then(function () {
+        // CB-something use VSINSTALLDIR environment if defined to find MSBuild
+        // If VSINSTALLDIR is not specified use default discovery mechanism
+        if (!process.env.VSINSTALLDIR) {
+            return MSBuildTools.findAllAvailableVersions();
+        }
+
+        events.emit('log', 'Found VSINSTALLDIR environment variable. Attempting to build project using that version of MSBuild');
+
+        return MSBuildTools.getMSBuildToolsAt(process.env.VSINSTALLDIR)
+        .then(function (tools) { return [tools]; })
+        .catch(function (err) {
+            // If we failed to find msbuild at VSINSTALLDIR
+            // location we fall back to default discovery
+            return MSBuildTools.findAllAvailableVersions();
+        });
+    })
     .then(function(msbuildTools) {
         // Apply build related configs
         prepare.updateBuildConfig(buildConfig);
@@ -71,10 +87,11 @@ module.exports.run = function run (buildOptions) {
         }
 
         cleanIntermediates();
-        return buildTargets(msbuildTools, buildConfig).then(function(pkg) {
-            events.emit('verbose', ' BUILD OUTPUT: ' + pkg.appx);
-            return pkg;
-        });
+        return buildTargets(msbuildTools, buildConfig);
+    })
+    .then(function(pkg) {
+        events.emit('verbose', ' BUILD OUTPUT: ' + pkg.appx);
+        return pkg;
     });
 };
 


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cordova.apache.org
For additional commands, e-mail: commits-help@cordova.apache.org