jmcreater
Version:
udc前端开发构建工具
173 lines (152 loc) • 5.67 kB
JavaScript
;
var fs = require('fs-extra');
var path = require('path');
var request = require('request');
var _ = require('lodash');
var chalk = require('chalk');
var inquirer = require('inquirer');
var unzip = require('unzip');
var Base = require('./base');
var Util = require('../util');
class App extends Base {
constructor(options) {
super(options);
this.conf = _.assign({
appName: null,
description: ''
}, options);
this.init();
}
init() {
this.userName = process.env.USERNAME || 'UDC-Developer';
}
//创建新项目
create(cb) {
var self = this;
this.getTemplatesInfo(function (templatesinfo) {
self.talk(cb, templatesinfo || {})
})
}
//选择希望使用的模板
talk(cb, templatesinfo) {
var prompts = [];
var conf = this.conf;
var checkAppName = function (hasName) {
if (hasName) {
console.log('项目名称已经存在了,换个名字吧');
}
/*prompts.push({
type: 'input',
name: "appName",
message: "请输入项目名称~",
validate: function (input) {
if (!input) {
return ''
}
if (fs.existsSync(input)) {
return '项目已经存在了,换个名字吧'
}
return true;
}
})*/
}
if (typeof conf.appName !== 'string') {
checkAppName();
} else if (fs.existsSync(conf.appName)) {
checkAppName(true);
}
var tmpchoices = [];
if (!templatesinfo.templates) {
console.log('模板列表读取失败');
return;
}
templatesinfo.templates.forEach(function (o, i) {
tmpchoices.push(o.name);
})
prompts.push({
type: 'list',
name: 'tmpName',
message: '请选择项目模板:',
choices: tmpchoices
});
inquirer.prompt(prompts).then(function (answers) {
answers.appName = answers.appName || conf.appName;
answers.appDescription = answers.appDescription || conf.description;
answers.tmpName = answers.tmpName || conf.tmpName;
answers.author = this.userName;
answers.data = ((new Date()).getFullYear()) + '-' + ((new Date()).getMonth() + 1) + '-' + ((new Date()).getDate());
this.write(answers, templatesinfo.templates, cb);
}.bind(this))
}
//获得模板信息,模板内容,拷贝到本地
write(options, templatesinfo, cb) {
var conf = this.conf = options;
var tmpName = conf.tmpName;
var _cache = this.readCache(path.join(Util.getTmpPath(), '_cache.json'));
var templateCache = _cache.templates;
var cacheId = ""; //对应模板本地的id
var originId = ""; //服务器远程id
if (templateCache) {
templateCache.forEach(function (item) {
if (tmpName === item.name) {
cacheId = item.id;
}
});
}
templatesinfo.forEach(function (item) {
if (tmpName === item.name) {
originId = item.id;
}
});
if (cacheId === originId) {
this.copyTpl(tmpName, conf.appName, cb)
} else {
this.downloadTpl(tmpName, function () {
var currentItem = "";
templateCache.forEach(function (item) {
if (tmpName === item.name) {
item.id = originId;
currentItem = item;
}
});
if (!currentItem) {
_cache.templates.push({'name': tmpName, 'id': originId});
}
this.writeCache(_cache, path.join(Util.getTmpPath(), '_cache.json'));
this.copyTpl(tmpName, conf.appName, cb)
}.bind(this));
}
}
//下载远程模板到缓存路径
downloadTpl(tmpName, cb) {
console.log(chalk.green(' 正在下载最新的模板,请稍等...'));
var self = this;
var _tmpPath = path.join(Util.getTmpPath(), tmpName + '.zip'); //下载后存放目录
var setting = Util.getDefaultConfig();
request(setting["tpl-server"] + "/" + tmpName + '.zip')
.pipe(fs.createWriteStream(_tmpPath))
.on('finish', function () {
var templatesPath = path.join(Util.getTmpPath(), 'templates');
var zip = unzip.Extract({path: templatesPath});
zip
.on('close', function () {
fs.unlinkSync(_tmpPath);
cb();
})
.on('error', function (err) {
console.log(err);
});
fs.createReadStream(_tmpPath)
.pipe(zip);
});
}
//复制模板到指定目录
copyTpl(tmpName, appName, cb) {
var templatesPath = path.join(Util.getTmpPath(), 'templates', tmpName);
var targetPath = appName ? (path.join(process.cwd(), appName)) : process.cwd();
fs.copy(templatesPath, targetPath, function () {
cb();
})
}
}
module.exports = App;