hpmo
Version:
hybirdApp package manager
89 lines (77 loc) • 2.73 kB
JavaScript
/**
*
* hpm init
* @namespace hpm
* @author 仈爪 <haibin.zhb@alipay.com>
* @version 1.0.0
*
* */
var fs = require('fs-extra'),
colors = require('colors'),
file = require('./sdk/file'),
path = require('path');
module.exports = function (options) {
var old_hpmfile = file.readJSON('hpmfile.json', false);
var hpmfile = file.readJSON(path.join(options.tplpath, 'hpmfile.json'), false);
if (old_hpmfile) {
if (!options.id && old_hpmfile.appid) {
options.id = old_hpmfile.appid;
}
for (var k in old_hpmfile) {
if (!('support' == k && !!old_hpmfile[k]['platform']))
hpmfile[k] = old_hpmfile[k];
}
}
if (!options.id) {
console.error('ERROR: '.red + 'appid'.yellow + ' cannot be empty! please init with '.red + '-i'.yellow + ' option'.red);
return false;
}
//如果当前已经存在老的hpmfile,则不再重新生成模版
if (!old_hpmfile) {
copySync(options, options.tplpath, process.cwd(), [/debug\.js$/, /^alipay\.js$/]);
}
options.id && (hpmfile.appid = options.id);
options.name && (hpmfile.name = options.name);
options.version && (hpmfile.version = options.version);
if (hpmfile.host) {
for (var k in hpmfile.host) {
if ("string" == typeof(hpmfile.host[k])) {
hpmfile.host[k] = hpmfile.host[k].replace("{{appid}}", hpmfile.appid);
}
}
}
file.writeJSON('hpmfile.json', hpmfile);
console.log('# ' + 'H5App init success!'.green);
};
// 复制文件或目录, follow src中的符号链接
// dst只能是目标本身, 而非目标所在目录; 已存在的dst不会被替换
// copy时文件整个读到内存
// 没有考虑符号链接无穷递归的情况
function copySync(option, src, dst, ignores) {
var dir = path.dirname(src);
var stats = fs.lstatSync(src);
if (stats.isSymbolicLink()) {
return copySync(option, path.resolve(dir, fs.readlinkSync(src)), dst, ignores);
}
if (stats.isDirectory()) {
if (!fs.existsSync(dst)) {
fs.mkdirsSync(dst);
}
fs.readdirSync(src).forEach(function (name) {
for (var i = 0; i < (ignores || []).length; ++i) {
if (ignores[i].test(name)) {
return;
}
}
copySync(option, path.join(src, name), path.join(dst, name), ignores);
});
} else {
var dstDir = path.dirname(dst);
if (!fs.existsSync(dstDir)) {
fs.mkdirsSync(path.dirname(dst));
}
if (!fs.existsSync(dst)) {
fs.writeFileSync(dst, fs.readFileSync(src));
}
}
}