You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by ag...@apache.org on 2015/02/12 22:17:02 UTC
android commit: CB-8469 Create gradle build files as part of create
script
Repository: cordova-android
Updated Branches:
refs/heads/master 9baa27508 -> db18e1480
CB-8469 Create gradle build files as part of create script
Makes project imporatable by Android Studio before first build
Project: http://git-wip-us.apache.org/repos/asf/cordova-android/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-android/commit/db18e148
Tree: http://git-wip-us.apache.org/repos/asf/cordova-android/tree/db18e148
Diff: http://git-wip-us.apache.org/repos/asf/cordova-android/diff/db18e148
Branch: refs/heads/master
Commit: db18e1480ee26f47c6cbb6763627d60b735c0167
Parents: 9baa275
Author: Andrew Grieve <ag...@chromium.org>
Authored: Thu Feb 12 16:15:43 2015 -0500
Committer: Andrew Grieve <ag...@chromium.org>
Committed: Thu Feb 12 16:15:43 2015 -0500
----------------------------------------------------------------------
bin/lib/create.js | 7 ++
bin/templates/cordova/lib/build.js | 151 ++++++++++++++++++--------------
2 files changed, 93 insertions(+), 65 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cordova-android/blob/db18e148/bin/lib/create.js
----------------------------------------------------------------------
diff --git a/bin/lib/create.js b/bin/lib/create.js
index 17c7f67..8f52d7c 100755
--- a/bin/lib/create.js
+++ b/bin/lib/create.js
@@ -115,6 +115,11 @@ function writeProjectProperties(projectPath, target_api) {
fs.writeFileSync(dstPath, data);
}
+function prepBuildFiles(projectPath) {
+ var buildModule = require(path.join(path.resolve(projectPath), 'cordova', 'lib', 'build'));
+ buildModule.prepBuildFiles();
+}
+
function copyBuildRules(projectPath) {
var srcDir = path.join(ROOT, 'bin', 'templates', 'project');
@@ -273,6 +278,7 @@ exports.createProject = function(project_path, package_name, project_name, proje
});
// Link it to local android install.
writeProjectProperties(project_path, target_api);
+ prepBuildFiles(project_path);
console.log(generateDoneMessage('create', use_shared_project));
});
};
@@ -313,6 +319,7 @@ exports.updateProject = function(projectPath, shared) {
copyBuildRules(projectPath);
removeDebuggableFromManifest(projectPath);
writeProjectProperties(projectPath, target_api);
+ prepBuildFiles(project_path);
console.log(generateDoneMessage('update', shared));
});
};
http://git-wip-us.apache.org/repos/asf/cordova-android/blob/db18e148/bin/templates/cordova/lib/build.js
----------------------------------------------------------------------
diff --git a/bin/templates/cordova/lib/build.js b/bin/templates/cordova/lib/build.js
index 668a228..2d4df55 100644
--- a/bin/templates/cordova/lib/build.js
+++ b/bin/templates/cordova/lib/build.js
@@ -209,9 +209,71 @@ var builders = {
return args;
},
+ // Makes the project buildable, minus the gradle wrapper.
+ prepBuildFiles: function() {
+ var projectPath = ROOT;
+ // Update the version of build.gradle in each dependent library.
+ var pluginBuildGradle = path.join(projectPath, 'cordova', 'lib', 'plugin-build.gradle');
+ var propertiesObj = readProjectProperties();
+ var subProjects = propertiesObj.libs;
+ for (var i = 0; i < subProjects.length; ++i) {
+ if (subProjects[i] !== 'CordovaLib') {
+ shell.cp('-f', pluginBuildGradle, path.join(ROOT, subProjects[i], 'build.gradle'));
+ }
+ }
+
+ var subProjectsAsGradlePaths = subProjects.map(function(p) { return ':' + p.replace(/[/\\]/g, ':'); });
+ // Write the settings.gradle file.
+ fs.writeFileSync(path.join(projectPath, 'settings.gradle'),
+ '// GENERATED FILE - DO NOT EDIT\n' +
+ 'include ":"\n' +
+ 'include "' + subProjectsAsGradlePaths.join('"\ninclude "') + '"\n');
+ // Update dependencies within build.gradle.
+ var buildGradle = fs.readFileSync(path.join(projectPath, 'build.gradle'), 'utf8');
+ var depsList = '';
+ subProjectsAsGradlePaths.forEach(function(p) {
+ depsList += ' debugCompile project(path: "' + p + '", configuration: "debug")\n';
+ depsList += ' releaseCompile project(path: "' + p + '", configuration: "release")\n';
+ });
+ // For why we do this mapping: https://issues.apache.org/jira/browse/CB-8390
+ var SYSTEM_LIBRARY_MAPPINGS = [
+ [/^\/?extras\/android\/support\/(.*)$/, 'com.android.support:support-$1:+'],
+ [/^\/?google\/google_play_services\/libproject\/google-play-services_lib\/?$/, 'com.google.android.gms:play-services:+']
+ ];
+ propertiesObj.systemLibs.forEach(function(p) {
+ var mavenRef;
+ // It's already in gradle form if it has two ':'s
+ if (/:.*:/.exec(p)) {
+ mavenRef = p;
+ } else {
+ for (var i = 0; i < SYSTEM_LIBRARY_MAPPINGS.length; ++i) {
+ var pair = SYSTEM_LIBRARY_MAPPINGS[i];
+ if (pair[0].exec(p)) {
+ mavenRef = p.replace(pair[0], pair[1]);
+ break;
+ }
+ }
+ if (!mavenRef) {
+ throw new Error('Unsupported system library (does not work with gradle): ' + p);
+ }
+ }
+ depsList += ' compile "' + mavenRef + '"\n';
+ });
+ buildGradle = buildGradle.replace(/(SUB-PROJECT DEPENDENCIES START)[\s\S]*(\/\/ SUB-PROJECT DEPENDENCIES END)/, '$1\n' + depsList + ' $2');
+ var includeList = '';
+ propertiesObj.gradleIncludes.forEach(function(includePath) {
+ includeList += 'apply from: "' + includePath + '"\n';
+ });
+ buildGradle = buildGradle.replace(/(PLUGIN GRADLE EXTENSIONS START)[\s\S]*(\/\/ PLUGIN GRADLE EXTENSIONS END)/, '$1\n' + includeList + '$2');
+ fs.writeFileSync(path.join(projectPath, 'build.gradle'), buildGradle);
+ },
+
prepEnv: function() {
+ var self = this;
return check_reqs.check_gradle()
.then(function() {
+ return self.prepBuildFiles();
+ }).then(function() {
// Copy the gradle wrapper on each build so that:
// A) we don't require the Android SDK at project creation time, and
// B) we always use the SDK's latest version of it.
@@ -235,61 +297,6 @@ var builders = {
var distributionUrl = 'distributionUrl=http\\://services.gradle.org/distributions/gradle-2.2.1-all.zip';
var gradleWrapperPropertiesPath = path.join(projectPath, 'gradle', 'wrapper', 'gradle-wrapper.properties');
shell.sed('-i', distributionUrlRegex, distributionUrl, gradleWrapperPropertiesPath);
-
- // Update the version of build.gradle in each dependent library.
- var pluginBuildGradle = path.join(projectPath, 'cordova', 'lib', 'plugin-build.gradle');
- var propertiesObj = readProjectProperties();
- var subProjects = propertiesObj.libs;
- for (var i = 0; i < subProjects.length; ++i) {
- if (subProjects[i] !== 'CordovaLib') {
- shell.cp('-f', pluginBuildGradle, path.join(ROOT, subProjects[i], 'build.gradle'));
- }
- }
-
- var subProjectsAsGradlePaths = subProjects.map(function(p) { return ':' + p.replace(/[/\\]/g, ':'); });
- // Write the settings.gradle file.
- fs.writeFileSync(path.join(projectPath, 'settings.gradle'),
- '// GENERATED FILE - DO NOT EDIT\n' +
- 'include ":"\n' +
- 'include "' + subProjectsAsGradlePaths.join('"\ninclude "') + '"\n');
- // Update dependencies within build.gradle.
- var buildGradle = fs.readFileSync(path.join(projectPath, 'build.gradle'), 'utf8');
- var depsList = '';
- subProjectsAsGradlePaths.forEach(function(p) {
- depsList += ' debugCompile project(path: "' + p + '", configuration: "debug")\n';
- depsList += ' releaseCompile project(path: "' + p + '", configuration: "release")\n';
- });
- // For why we do this mapping: https://issues.apache.org/jira/browse/CB-8390
- var SYSTEM_LIBRARY_MAPPINGS = [
- [/^\/?extras\/android\/support\/(.*)$/, 'com.android.support:support-$1:+'],
- [/^\/?google\/google_play_services\/libproject\/google-play-services_lib\/?$/, 'com.google.android.gms:play-services:+']
- ];
- propertiesObj.systemLibs.forEach(function(p) {
- var mavenRef;
- // It's already in gradle form if it has two ':'s
- if (/:.*:/.exec(p)) {
- mavenRef = p;
- } else {
- for (var i = 0; i < SYSTEM_LIBRARY_MAPPINGS.length; ++i) {
- var pair = SYSTEM_LIBRARY_MAPPINGS[i];
- if (pair[0].exec(p)) {
- mavenRef = p.replace(pair[0], pair[1]);
- break;
- }
- }
- if (!mavenRef) {
- throw new Error('Unsupported system library (does not work with gradle): ' + p);
- }
- }
- depsList += ' compile "' + mavenRef + '"\n';
- });
- buildGradle = buildGradle.replace(/(SUB-PROJECT DEPENDENCIES START)[\s\S]*(\/\/ SUB-PROJECT DEPENDENCIES END)/, '$1\n' + depsList + ' $2');
- var includeList = '';
- propertiesObj.gradleIncludes.forEach(function(includePath) {
- includeList += 'apply from: "' + includePath + '"\n';
- });
- buildGradle = buildGradle.replace(/(PLUGIN GRADLE EXTENSIONS START)[\s\S]*(\/\/ PLUGIN GRADLE EXTENSIONS END)/, '$1\n' + includeList + '$2');
- fs.writeFileSync(path.join(projectPath, 'build.gradle'), buildGradle);
});
},
@@ -380,6 +387,8 @@ function parseOpts(options, resolvedTarget) {
// Don't need to do anything special to when building for device vs emulator.
// iOS uses this flag to switch on architecture.
break;
+ case 'prepenv' :
+ ret.prepEnv = true;
case 'nobuild' :
ret.buildMethod = 'none';
break;
@@ -429,19 +438,30 @@ module.exports.run = function(options, optResolvedTarget) {
var builder = builders[opts.buildMethod];
return builder.prepEnv()
.then(function() {
- return builder.build(opts.buildType, opts.arch, opts.extraArgs);
- }).then(function() {
- var apkPaths = builder.findOutputApks(opts.buildType, opts.arch);
- console.log('Built the following apk(s):');
- console.log(' ' + apkPaths.join('\n '));
- return {
- apkPaths: apkPaths,
- buildType: opts.buildType,
- buildMethod: opts.buildMethod
- };
+ if (opts.prepEnv) {
+ console.log('Build file successfully prepared.');
+ return;
+ }
+ return builder.build(opts.buildType, opts.arch, opts.extraArgs)
+ .then(function() {
+ var apkPaths = builder.findOutputApks(opts.buildType, opts.arch);
+ console.log('Built the following apk(s):');
+ console.log(' ' + apkPaths.join('\n '));
+ return {
+ apkPaths: apkPaths,
+ buildType: opts.buildType,
+ buildMethod: opts.buildMethod
+ };
+ });
});
};
+// Called by plugman after installing plugins, and by create script after creating project.
+module.exports.prepBuildFiles = function() {
+ var builder = builders['gradle'];
+ return builder.prepBuildFiles();
+};
+
/*
* Detects the architecture of a device/emulator
* Returns "arm" or "x86".
@@ -517,6 +537,7 @@ module.exports.help = function() {
console.log(' \'--ant\': will build project with ant');
console.log(' \'--gradle\': will build project with gradle (default)');
console.log(' \'--nobuild\': will skip build process (useful when using run command)');
+ console.log(' \'--prepenv\': don\'t build, but copy in build scripts where necessary');
console.log(' \'--versionCode=#\': Override versionCode for this build. Useful for uploading multiple APKs. Requires --gradle.');
console.log(' \'--minSdkVersion=#\': Override minSdkVersion for this build. Useful for uploading multiple APKs. Requires --gradle.');
console.log(' \'--gradleArg=<gradle command line arg>\': Extra args to pass to the gradle command. Use one flag per arg. Ex. --gradleArg=-PcdvBuildMultipleApks=true');
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cordova.apache.org
For additional commands, e-mail: commits-help@cordova.apache.org