CB-5232 Change create script to use Cordova as a library.

This commit is contained in:
Andrew Grieve 2013-10-30 12:18:20 -04:00
parent 8b379cbf56
commit fd954adc81
4 changed files with 89 additions and 56 deletions

View File

@ -20,20 +20,17 @@
*/ */
var path = require('path'); var path = require('path');
var create = require('./lib/create'); var create = require('./lib/create');
var args = process.argv; var args = require('./lib/simpleargs').getArgs(process.argv);
// Support basic help commands if (args['--help'] || args._.length === 0) {
if(args.length < 3 || (args[2] == '--help' || args[2] == '/?' || args[2] == '-h' || console.log('Usage: ' + path.relative(process.cwd(), path.join(__dirname, 'create')) + ' <path_to_new_project> <package_name> <project_name> [<template_path>] [--shared]');
args[2] == 'help' || args[2] == '-help' || args[2] == '/help')) {
console.log('Usage: ' + path.relative(process.cwd(), path.join(__dirname, 'create')) + ' <path_to_new_project> <package_name> <project_name>');
console.log(' <path_to_new_project>: Path to your new Cordova Android project'); console.log(' <path_to_new_project>: Path to your new Cordova Android project');
console.log(' <package_name>: Package name, following reverse-domain style convention'); console.log(' <package_name>: Package name, following reverse-domain style convention');
console.log(' <project_name>: Project name'); console.log(' <project_name>: Project name');
console.log(' <template_path>: Path to a custom application template to use');
console.log(' --shared will use the CordovaLib project directly instead of making a copy.');
process.exit(1); process.exit(1);
} else {
create.createProject(args[2], args[3], args[4], args[5]).done(null, function(err) {
console.error(err);
process.exit(2);
});
} }
create.createProject(args._[0], args._[1], args._[2], args._[3], args['--shared']).done();

View File

@ -29,14 +29,13 @@ var shell = require('shelljs'),
// Returns a promise. // Returns a promise.
function exec(command, opt_cwd) { function exec(command, opt_cwd) {
var d = Q.defer(); var d = Q.defer();
try { console.log('Running: ' + command);
child_process.exec(command, { cwd: opt_cwd }, function(err, stdout, stderr) { child_process.exec(command, { cwd: opt_cwd }, function(err, stdout, stderr) {
if (err) d.reject(err); stdout && console.log(stdout);
else d.resolve(stdout); stderr && console.error(stderr);
}); if (err) d.reject(err);
} catch(e) { else d.resolve(stdout);
return Q.reject('Command error on execution: ' + command + '\n' + e); });
}
return d.promise; return d.promise;
} }
@ -47,32 +46,45 @@ function setShellFatal(value, func) {
shell.config.fatal = oldVal; shell.config.fatal = oldVal;
} }
// Returns a promise. function getFrameworkDir(projectPath, shared) {
function ensureJarIsBuilt(version, target_api) { return shared ? path.join(ROOT, 'framework') : path.join(projectPath, 'CordovaLib');
var isDevVersion = /-dev$/.test(version);
if (isDevVersion || !fs.existsSync(path.join(ROOT, 'framework', 'cordova-' + version + '.jar')) && fs.existsSync(path.join(ROOT, 'framework'))) {
var valid_target = check_reqs.get_target();
console.log('Building cordova-' + version + '.jar');
// update the cordova-android framework for the desired target
return exec('android --silent update lib-project --target "' + target_api + '" --path "' + path.join(ROOT, 'framework') + '"')
.then(function() {
// compile cordova.js and cordova.jar
return exec('ant jar', path.join(ROOT, 'framework'));
});
}
return Q();
} }
function copyJsAndJar(projectPath, version) { function copyJsAndLibrary(projectPath, shared, projectName) {
var nestedCordovaLibPath = getFrameworkDir(projectPath, false);
shell.cp('-f', path.join(ROOT, 'framework', 'assets', 'www', 'cordova.js'), path.join(projectPath, 'assets', 'www', 'cordova.js')); shell.cp('-f', path.join(ROOT, 'framework', 'assets', 'www', 'cordova.js'), path.join(projectPath, 'assets', 'www', 'cordova.js'));
// Don't fail if there are no old jars. // Don't fail if there are no old jars.
setShellFatal(false, function() { setShellFatal(false, function() {
shell.ls(path.join(projectPath, 'libs', 'cordova-*.jar')).forEach(function(oldJar) { shell.ls(path.join(projectPath, 'libs', 'cordova-*.jar')).forEach(function(oldJar) {
console.log("Deleting " + oldJar); console.log("Deleting " + oldJar);
shell.rm('-f', path.join(oldJar)); shell.rm('-f', oldJar);
}); });
// Delete old library project if it existed.
if (shared) {
shell.rm('-rf', nestedCordovaLibPath);
} else {
// Delete only the src, since eclipse can't handle its .project file being deleted.
shell.rm('-rf', path.join(nestedCordovaLibPath, 'src'));
}
}); });
shell.cp('-f', path.join(ROOT, 'framework', 'cordova-' + version + '.jar'), path.join(projectPath, 'libs', 'cordova-' + version + '.jar')); if (!shared) {
shell.mkdir('-p', nestedCordovaLibPath);
shell.cp('-f', path.join(ROOT, 'framework', 'AndroidManifest.xml'), nestedCordovaLibPath);
shell.cp('-f', path.join(ROOT, 'framework', 'project.properties'), nestedCordovaLibPath);
shell.cp('-r', path.join(ROOT, 'framework', 'src'), nestedCordovaLibPath);
// Create an eclipse project file and set the name of it to something unique.
// Without this, you can't import multiple CordovaLib projects into the same workspace.
var eclipseProjectFilePath = path.join(nestedCordovaLibPath, '.project');
if (!fs.existsSync(eclipseProjectFilePath)) {
var data = '<?xml version="1.0" encoding="UTF-8"?><projectDescription><name>' + projectName + '-' + 'CordovaLib</name></projectDescription>';
fs.writeFileSync(eclipseProjectFilePath, data, 'utf8');
}
}
}
function runAndroidUpdate(projectPath, target_api, shared) {
var targetFrameworkDir = getFrameworkDir(projectPath, shared);
return exec('android update project --subprojects --path "' + projectPath + '" --target ' + target_api + ' --library "' + path.relative(projectPath, targetFrameworkDir) + '"');
} }
function copyScripts(projectPath) { function copyScripts(projectPath) {
@ -104,7 +116,7 @@ function copyScripts(projectPath) {
* Returns a promise. * Returns a promise.
*/ */
exports.createProject = function(project_path, package_name, project_name, project_template_dir) { exports.createProject = function(project_path, package_name, project_name, project_template_dir, use_shared_project) {
var VERSION = fs.readFileSync(path.join(ROOT, 'VERSION'), 'utf-8').trim(); var VERSION = fs.readFileSync(path.join(ROOT, 'VERSION'), 'utf-8').trim();
// Set default values for path, package and name // Set default values for path, package and name
@ -142,9 +154,6 @@ exports.createProject = function(project_path, package_name, project_name, proje
console.log('\tName: ' + project_name); console.log('\tName: ' + project_name);
console.log('\tAndroid target: ' + target_api); console.log('\tAndroid target: ' + target_api);
// build from source. distro should have these files
return ensureJarIsBuilt(VERSION, target_api);
}).then(function() {
console.log('Copying template files...'); console.log('Copying template files...');
setShellFatal(true, function() { setShellFatal(true, function() {
@ -156,7 +165,7 @@ exports.createProject = function(project_path, package_name, project_name, proje
// copy cordova.js, cordova.jar and res/xml // copy cordova.js, cordova.jar and res/xml
shell.cp('-r', path.join(ROOT, 'framework', 'res', 'xml'), path.join(project_path, 'res')); shell.cp('-r', path.join(ROOT, 'framework', 'res', 'xml'), path.join(project_path, 'res'));
copyJsAndJar(project_path, VERSION); copyJsAndLibrary(project_path, use_shared_project, safe_activity_name);
// interpolate the activity name and package // interpolate the activity name and package
shell.mkdir('-p', activity_dir); shell.mkdir('-p', activity_dir);
@ -172,8 +181,7 @@ exports.createProject = function(project_path, package_name, project_name, proje
copyScripts(project_path); copyScripts(project_path);
}); });
// Link it to local android install. // Link it to local android install.
console.log('Running "android update project"'); return runAndroidUpdate(project_path, target_api, use_shared_project);
return exec('android --silent update project --target "'+target_api+'" --path "'+ project_path+'"');
}).then(function() { }).then(function() {
console.log('Project successfully created.'); console.log('Project successfully created.');
}); });
@ -186,11 +194,12 @@ exports.updateProject = function(projectPath) {
return check_reqs.run() return check_reqs.run()
.then(function() { .then(function() {
var target_api = check_reqs.get_target(); var target_api = check_reqs.get_target();
return ensureJarIsBuilt(version, target_api); copyJsAndLibrary(projectPath, false, null);
}).then(function() {
copyJsAndJar(projectPath, version);
copyScripts(projectPath); copyScripts(projectPath);
console.log('Android project is now at version ' + version); return runAndroidUpdate(projectPath, target_api, false)
.then(function() {
console.log('Android project is now at version ' + version);
});
}); });
}; };

32
bin/lib/simpleargs.js Normal file
View File

@ -0,0 +1,32 @@
/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
*/
exports.getArgs = function(argv) {
var ret = {};
var posArgs = [];
for (var i = 2, arg; arg = argv[i] || i < argv.length; ++i) {
if (/^--/.exec(arg)) {
ret[arg] = true;
} else {
posArgs.push(arg);
}
}
ret._ = posArgs;
return ret;
};

View File

@ -19,18 +19,13 @@
under the License. under the License.
*/ */
var path = require('path'); var path = require('path');
var args = process.argv;
var create = require('./lib/create'); var create = require('./lib/create');
var args = require('./lib/simpleargs').getArgs(process.argv);
// Support basic help commands if (args['--help'] || args._.length === 0) {
if(args.length < 3 || (args[2] == '--help' || args[2] == '/?' || args[2] == '-h' || console.log('Usage: ' + path.relative(process.cwd(), path.join(__dirname, 'update')) + ' <path_to_project> [--shared]');
args[2] == 'help' || args[2] == '-help' || args[2] == '/help')) { console.log(' --shared will use the CordovaLib project directly instead of making a copy.');
console.log('Usage: ' + path.relative(process.cwd(), path.join(__dirname, 'update')) + ' <path_to_project>');
process.exit(1); process.exit(1);
} else {
create.updateProject(args[2]).done(null, function(err) {
console.error(err);
process.exit(2);
});
} }
create.updateProject(args._[0], args['--shared']).done();