dragonbones-runtime
Version:
the tools to build dragonbones file for diffrent framework
412 lines (411 loc) • 17.3 kB
JavaScript
/// <reference path="../lib/types.d.ts" />
//import globals = require("../globals");
//import params = require("../ParamsParser");
var file = require("../lib/FileUtil");
var EgretProject = require("../project");
var ParseConfigCommand = require("../actions/ParseConfig");
var fs = require('fs');
var cp_exec = require('child_process').exec;
var copyNative = require("../actions/CopyNativeFiles");
var CreateAppCommand = (function () {
function CreateAppCommand() {
this.androidHomeWarnning = "请设置环境变量 ANDROID_HOME ,值为 Android SDK 的根目录。";
}
CreateAppCommand.prototype.execute = function () {
this.run();
return DontExitCode;
};
CreateAppCommand.prototype.run = function () {
var option = egret.args;
var appName = option.commands[1];
var projectDir = option.projectDir;
var nativeTemplatePath = option.nativeTemplatePath;
var arg_h5_path = option.fileName;
var reg = new RegExp("^[a-zA-Z]");
if (!reg.test(appName)) {
globals.exit(1612);
}
if (!projectDir) {
globals.exit(1610);
}
if (file.exists(projectDir)) {
globals.exit(1611);
}
if (!nativeTemplatePath || !arg_h5_path) {
globals.exit(1601);
}
//判断项目合法性
var isEgretProject = false;
var egretPropertiesPath = file.joinPath(arg_h5_path, "egretProperties.json");
if (file.exists(egretPropertiesPath)) {
isEgretProject = true;
}
if (isEgretProject) {
var properties = JSON.parse(file.read(egretPropertiesPath));
if (properties["egret_version"]) {
isEgretProject = true;
}
else {
isEgretProject = false;
}
}
if (!isEgretProject) {
globals.exit(1602);
}
option.projectDir = arg_h5_path;
var startTime = Date.now();
var app_data = this.read_json_from(file.joinPath(nativeTemplatePath, "create_app.json"));
if (!app_data) {
globals.exit(1603, nativeTemplatePath);
}
var platform = "";
if (file.exists(file.joinPath(nativeTemplatePath, "proj.android"))) {
if (file.isFile(file.joinPath(file.joinPath(nativeTemplatePath, "proj.android"), "build.gradle"))) {
platform = "android_as";
}
else {
platform = "android";
}
}
else if (file.exists(file.joinPath(nativeTemplatePath, "proj.ios"))) {
platform = "ios";
}
else {
globals.exit(1601);
}
var projectPath = file.joinPath(arg_h5_path);
var nativePath = file.joinPath(projectDir);
file.remove(nativePath);
//生成native工程
this.create_app_from(nativePath, nativeTemplatePath, app_data);
//修改egretProperties.json文件路径
var properties = JSON.parse(file.read(file.joinPath(projectPath, "egretProperties.json")));
if (properties["native"] == null) {
properties["native"] = {};
}
properties["native"][platform + "_path"] = file.relative(projectPath, nativePath);
file.save(file.joinPath(projectPath, "egretProperties.json"), JSON.stringify(properties, null, "\t"));
EgretProject.data.init(arg_h5_path);
//修改native项目配置
new ParseConfigCommand().execute();
var manifestPath = file.joinPath(egret.args.projectDir, "manifest.json");
EgretProject.manager.modifyNativeRequire(manifestPath);
//拷贝项目到native工程中
copyNative.refreshNative(true);
globals.log2(1606, (Date.now() - startTime) / 1000);
};
CreateAppCommand.prototype.create_app_from = function (app_path, template_path, app_data) {
// copy from project template
globals.log(1607);
if (app_data["template"]["zip"]) {
this.run_unzip(app_path, template_path, app_data);
}
else {
app_data["template"]["source"].forEach(function (source) {
file.copy(file.joinPath(template_path, source), file.joinPath(app_path, source));
});
this.rename_app(app_path, app_data);
if (file.isFile(file.joinPath(file.joinPath(app_path, "proj.android"), "build.gradle"))) {
this.modifyAndroidStudioSupport(app_path);
this.modifyLocalProperties(app_path);
}
else if (file.isFile(file.joinPath(file.joinPath(app_path, "proj.android"), "project.properties"))) {
//修改ADT工程的
this.modifyAndroidADTSupport(app_path);
}
}
};
CreateAppCommand.prototype.rename_app = function (app_path, app_data) {
// replace keyword in content
globals.log(1608);
app_data["rename_tree"]["content"].forEach(function (content) {
var target_path = file.joinPath(app_path, content);
var c = file.read(target_path);
c = c.replace(new RegExp(app_data["template_name"], "g"), file.basename(app_path));
file.save(target_path, c);
});
// rename keyword in project name
globals.log(1609);
app_data["rename_tree"]["file_name"].forEach(function (f) {
var str = file.joinPath(app_path, f);
var offset = app_data["template_name"].length;
var index = str.lastIndexOf(app_data["template_name"]);
if (index > 0) {
var target_str = str.substring(0, index) + file.basename(app_path) + str.substring(index + offset);
fs.renameSync(str, target_str);
}
});
};
CreateAppCommand.prototype.getBuildToolVersion = function (buildToolDir) {
var propertiesFile = file.joinPath(buildToolDir, "source.properties");
if (file.isFile(propertiesFile)) {
var fileContent = file.read(propertiesFile, true);
var lines = fileContent.split("\n");
var index = -1;
var version = "";
for (var i = 0; i < lines.length; i++) {
index = lines[i].indexOf("Revision");
if (index != -1) {
version = lines[i].substring(lines[i].indexOf("=") + 1);
index = version.indexOf("\r");
if (index != -1) {
version = version.substring(0, index);
}
// console.log(version+":"+version.length+"; "+version.indexOf("\r")+" ; c = "+version.charCodeAt(version.length-1));
break;
}
}
//console.log(propertiesFile + " : "+version);
return version;
}
else {
globals.log(1619, buildToolDir);
}
return "undefined";
};
CreateAppCommand.prototype.getAndroidBuildToolValue = function () {
// check ANDROID_HOME
var android_home = process.env.ANDROID_HOME;
if (!android_home) {
console.error(this.androidHomeWarnning);
globals.exit(1610);
}
//get Android build tool version
var buildToolsPath = file.joinPath(android_home, "build-tools");
if (!file.isDirectory(buildToolsPath)) {
globals.log(1618, android_home);
globals.exit(1611);
}
var files = file.getDirectoryListing(buildToolsPath, false);
var length = files.length;
var buildToolVersion = "undefined";
var resultVersion = buildToolVersion;
var versionValue = 0.0;
var tempVersion = 0.0;
for (var i = 0; i < length; i++) {
if (files[i].charAt(0) == ".") {
continue;
}
var path = files[i];
if (file.isDirectory(path)) {
buildToolVersion = this.getBuildToolVersion(path);
if ("undefined" != buildToolVersion) {
versionValue = parseFloat(buildToolVersion);
if (versionValue > tempVersion) {
tempVersion = versionValue;
resultVersion = buildToolVersion;
}
}
}
}
//console.log("buildToolVersion = "+resultVersion);
return resultVersion;
};
;
CreateAppCommand.prototype.getAndroidSDKAPILevel = function (platformDir) {
var propertiesFile = file.joinPath(platformDir, "source.properties");
//console.log(" >>> check source.properties = "+propertiesFile);
if (file.isFile(propertiesFile)) {
var fileContent = file.read(propertiesFile, true);
var lines = fileContent.split("\n");
var index = -1;
var version = "";
for (var i = 0; i < lines.length; i++) {
index = lines[i].indexOf("AndroidVersion.ApiLevel");
if (index != -1) {
version = lines[i].substring(lines[i].indexOf("=") + 1);
index = version.indexOf("\r");
if (index != -1) {
version = version.substring(0, index);
}
// console.log(version+":"+version.length+"; "+version.indexOf("\r")+" ; c = "+version.charCodeAt(version.length-1));
break;
}
}
//console.log(propertiesFile + " : "+version);
return version;
}
else {
globals.log(1617, platformDir);
}
return "undefined";
};
CreateAppCommand.prototype.getAndroidSDKAPILevelValue = function (target_level) {
// check ANDROID_HOME
var android_home = process.env.ANDROID_HOME;
if (!android_home) {
console.error(this.androidHomeWarnning);
globals.exit(1610);
}
//get Android build tool version
var platformsPath = file.joinPath(android_home, "platforms");
if (!file.isDirectory(platformsPath)) {
globals.log(1616, android_home);
globals.exit(1611);
}
var files = file.getDirectoryListing(platformsPath, false);
var length = files.length;
var platformVersion = "undefined";
var resultVersion = platformVersion;
var versionValue = 0.0;
var tempVersion = 0.0;
for (var i = 0; i < length; i++) {
if (files[i].charAt(0) == ".") {
continue;
}
var path = files[i];
if (file.isDirectory(path)) {
platformVersion = this.getAndroidSDKAPILevel(path);
if ("undefined" != platformVersion) {
versionValue = parseInt(platformVersion);
//如果本地存在所需的SDK。直接返回
if ("undefined" != target_level && target_level == versionValue) {
resultVersion = target_level;
break;
}
if (versionValue > tempVersion) {
tempVersion = versionValue;
resultVersion = platformVersion;
}
}
}
}
//console.log("buildToolVersion = "+resultVersion);
return resultVersion;
};
;
CreateAppCommand.prototype.modifyAndroidStudioSupport = function (app_path) {
var buildToolVersion = this.getAndroidBuildToolValue();
var platformVersion = this.getAndroidSDKAPILevelValue();
//console.log("app_path:" + app_path);
var buildGradleFile = file.joinPath(file.joinPath(file.joinPath(app_path, "proj.android"), "app"), "build.gradle");
if (file.isFile(buildGradleFile)) {
var c = file.read(buildGradleFile);
c = c.replace(new RegExp("EGT_BUILD_TOOLS_VERSION", "g"), buildToolVersion);
c = c.replace(new RegExp("EGT_ANDROID_SDK", "g"), platformVersion);
file.save(buildGradleFile, c);
}
else {
globals.log(1615, file.getAbsolutePath(app_path));
globals.exit(1611);
}
};
;
CreateAppCommand.prototype.modifyLocalProperties = function (app_path) {
var android_home = process.env.ANDROID_HOME;
if (!android_home) {
console.error(this.androidHomeWarnning);
globals.exit(1612);
}
if (-1 != android_home.indexOf("\\")) {
android_home = android_home.split("\\").join("\\\\");
}
var localPropertiesFile = file.joinPath(file.joinPath(app_path, "proj.android"), "local.properties");
if (file.isFile(localPropertiesFile)) {
var c = file.read(localPropertiesFile);
c = c.replace(new RegExp("EGT_ANDROID_SDK_DIR", "g"), android_home);
file.save(localPropertiesFile, c);
}
else {
globals.exit(1614, file.getAbsolutePath(app_path));
}
};
;
//获取当前ADT项目默认的Android API Level
CreateAppCommand.prototype.getProjTargetAPILevel = function (app_path) {
var projectPropertiesFile = file.joinPath(file.joinPath(app_path, "proj.android"), "project.properties");
if (file.isFile(projectPropertiesFile)) {
var fileContent = file.read(projectPropertiesFile, true);
var lines = fileContent.split("\n");
var index = -1;
var index2 = -1;
var version = "";
for (var i = 0; i < lines.length; i++) {
index = lines[i].indexOf("target");
if (index != -1 && -1 != lines[i].indexOf("=")) {
version = lines[i].substring(lines[i].indexOf("-") + 1);
index = version.indexOf("\r");
if (index != -1) {
version = version.substring(0, index);
}
break;
}
}
return version;
}
else {
globals.log(1614, file.getAbsolutePath(app_path));
}
return "undefined";
};
;
//修正Android ADT Support 项目
CreateAppCommand.prototype.modifyAndroidADTSupport = function (app_path) {
var projTargetAPILevel = this.getProjTargetAPILevel(app_path);
if (projTargetAPILevel == "undefined") {
return;
}
var platformVersion = this.getAndroidSDKAPILevelValue(projTargetAPILevel);
if (platformVersion == "undefined") {
return;
}
if (parseInt(platformVersion) < parseInt(projTargetAPILevel)) {
console.error("All installed platforms is lower then project target API level , project target API Levle is = " + projTargetAPILevel + "; app_path:" + app_path);
return;
}
var projectPropertiesFile = file.joinPath(file.joinPath(app_path, "proj.android"), "project.properties");
if (file.isFile(projectPropertiesFile)) {
var fileContent = file.read(projectPropertiesFile);
var lines = fileContent.split("\n");
var len = lines.length;
var i = 0;
for (i = 0; i < len; i++) {
var index = lines[i].indexOf("target");
if (index != -1 && -1 != lines[i].indexOf("=")) {
var version = lines[i].substring(lines[i].indexOf("-") + 1);
index = version.indexOf("\r");
if (index != -1) {
version = version.substring(0, index);
}
var resultLine = lines[i].replace(new RegExp(version, "g"), platformVersion);
fileContent = fileContent.replace(new RegExp(lines[i], "g"), resultLine);
file.save(projectPropertiesFile, fileContent);
break;
}
}
}
else {
globals.log(1614, file.getAbsolutePath(app_path));
globals.exit(1611);
}
};
;
CreateAppCommand.prototype.run_unzip = function (app_path, template_path, app_data) {
var template_zip_path = file.joinPath(template_path, app_data["template"]["zip"]);
var cmd = "unzip -q " + globals.addQuotes(template_zip_path) + " -d " + globals.addQuotes(app_path);
//执行异步方法必须指定返回值为DontExitCode
var self = this;
var build = cp_exec(cmd);
build.stderr.on("data", function (data) {
globals.log(data);
});
build.on("exit", function (result) {
if (result == 0) {
self.rename_app(app_path, app_data);
}
else {
globals.log(1613);
}
});
};
CreateAppCommand.prototype.read_json_from = function (json_file) {
if (!fs.existsSync(json_file)) {
return null;
}
else {
return JSON.parse(file.read(json_file));
}
};
return CreateAppCommand;
}());
module.exports = CreateAppCommand;