UNPKG

aics

Version:
224 lines (210 loc) 7.5 kB
var path = require('path'); var fs = require('fs'); var cjson = require('cjson'); var request = require('request'); var qs = require('qs'); var unzip = require('unzip'); var walkSync = require('walk-sync'); var md5 = require('md5'); var archiver = require('archiver'); var Tools = require('../lib/tools'); var aicsConfig = require('../lib/config'); var AccountManager = require('../lib/account'); var chalk = require("chalk"); var argv = require('minimist')(process.argv.slice(2)); module.exports = PackageManager; function PackageManager() {} PackageManager.showPackages = function(params) { var packges = Tools.getAics(); var str = JSON.stringify(packges); str = str.replace('{', "").replace('}', "").replace(/\"/g, "").replace(/\,/g, "\n").replace(/\:(\d+\.\d+\.\d+)/g, "@$1"); console.log(chalk.green.bold("Packages has been Installed: ")); console.log(str); } PackageManager.remove = function(params) { var packageName = argv._.pop(); var packTmpPath = packageName.replace(":", '/'); var fulPath = '.aics/tmp/' + packTmpPath; var modifyArray = []; //读取.aics目录 !Tools.isExist(path.resolve(fulPath), true) ? (process.exit(0)) : ""; var tmpTrees = walkSync(path.resolve(fulPath), { directories: false }); for (var i = tmpTrees.length - 1; i >= 0; i--) { if (tmpTrees[i] == 'build.zip') { continue; } console.log("comparing - " + tmpTrees[i]); var org = Tools.isExist(fulPath + "/" + tmpTrees[i]) && fs.readFileSync(fulPath + "/" + tmpTrees[i]) var orgmd5 = md5(org); var tar = Tools.isExist(tmpTrees[i], false) && fs.readFileSync(tmpTrees[i]) var tarmd5 = md5(tar); if (tarmd5 == orgmd5) { console.log(chalk.green.bold(tmpTrees[i]) + " no modify.") } else { Tools.isExist(tmpTrees[i], true) ? ( console.log(chalk.red.bold(tmpTrees[i]) + " has been modify. "), modifyArray.push(tmpTrees[i]) ) : ""; } } console.log(chalk.green.bold("Compare Complate!")); if (modifyArray.length < 1) { for (var i = tmpTrees.length - 1; i >= 0; i--) { if (tmpTrees[i] == 'build.zip') { continue; } var isExist = fs.existsSync(tmpTrees[i]); if (isExist) { fs.unlinkSync(tmpTrees[i]); console.log('Remove ' + tmpTrees[i] + " Complate."); } } Tools.confRemove(packageName); } else { for (var i = modifyArray.length - 1; i >= 0; i--) { console.log(chalk.red.bold(modifyArray[i]) + ' Has been Modify,Remove Manually') } } } PackageManager.publish = function(params) { if (argv.P) { var config = require(path.resolve('.aics/project.json')); publishToProject(config); } else if (argv.h) { console.log(chalk.red.bold("\nUsage:\n")); console.log("publish [option] <string> 发布当前目录下的所有自定义代码包或项目"); console.log('option:') console.log(" <无option> 发布当前目录下指定的代码包"); console.log(" -P 发布当前目录下的项目"); return; } else { var trees = walkSync(path.resolve(".aics"), { globs: ['**/*.json'], directories: false }); var depots = ""; for (var i = 0; i < trees.length; i++) { trees[i].indexOf('.depot.json') >= 0 ? (depots += trees[i].split(".").shift() + ",") : "" } if (argv._.length < 2) { console.log("参数错误.可发布的代码包: " + depots) return; } var configPath = path.resolve('.aics/' + argv._.pop() + '.depot.json'); fs.stat(configPath, function(err, stats) { if (err) console.log('并不存在这个代码包.可发布的代码包:' + depots) if (stats) { var config = require(configPath); publishToDepot(config, configPath); } }) } } configCheck = function(config) { if (!config.prototype) { console.log("package belong to some prototype"); return false; } if (!config.name) { console.log("package need a name"); return false; } if (!config.version) { console.log("package need a version"); return false; } if (config.type != "project") { if (!config.files) { console.log("package need a files list"); return false; } } return true; } publishToDepot = function(config, depotConfigPath) { if (!configCheck(config)) { console.log(chalk.red.bold("\n配置文件出错.\n")); return; } var depotPath = config.name.split(':'); var tmppath = Tools.mkdir(path.resolve(".aics") + "/tmp/" + depotPath.join('/')); var zipPath = tmppath + '/build.zip'; var account = AccountManager.get(); var files = config.files; var packages = config.meteor.packages; var tmpArr = []; tmpArr.push("\n\n# imports froms "+config.name) packages = tmpArr.concat(packages).join('\n'); // var packages var output = fs.createWriteStream(zipPath); output.on('close', function() { config.name = config.name.replace("$", ":"); var r = request.post(aicsConfig.host + '/package/upload', function(err, httpResponse, body) { console.log(body) if (body == "ERROR") { console.log("系统错误请稍候重试 .. "); } else if (body == "NOPROTOTYPE") { console.log("未发现这个原型 " + config.prototype); } else if (body == "MISSNAME") { console.log("错误的代码包名称 account:name " + config.name); } else if (body == "MISSVERSION") { console.log("版本已经存在,请更新version " + config.name + ""); } else if (body.indexOf("REPEAT") >= 0) { console.log("文件名在在原型内重复 : " + config.name + ":" + body.split(":")[1]); } else if (body == "SUCCESS") { console.log("Success! http://codedepot.fami2u.com/package=" + config.name); } // console.log(body); fs.unlinkSync(zipPath); }); var form = r.form(); if (!account.secret) { console.log("账户未设置.") return; } form.append('secret', account.secret); form.append('config', fs.createReadStream(path.resolve(depotConfigPath))); form.append('zip', fs.createReadStream(path.resolve(zipPath))); if (config.documentation) { if (fs.existsSync(path.resolve(config.documentation))) { form.append('markdown', fs.createReadStream(path.resolve(config.documentation))); } } }); //生成archiver对象,打包类型为zip var zipArchiver = archiver('zip'); //将打包对象与输出流关联 zipArchiver.pipe(output); for (var i = 0; i < files.length; i++) { console.log(files[i]) if (!fs.existsSync(path.resolve(files[i]))) { console.log("未发现文件: " + config.name + " -->" + files[i]); process.exit(1); } //将被打包文件的流添加进archiver对象中 zipArchiver.append(fs.createReadStream(files[i]), { 'name': files[i] }); } //add packages to zip zipArchiver.append(new Buffer(packages), { 'name': 'packages' }); //打包 zipArchiver.finalize(); } publishToProject = function(config) { if (!configCheck(config)) { console.log(chalk.red.bold("配置文件出错.")); return; } fs.readFile(path.resolve(config.documentation), 'utf8', function(err, res) { config.documentation = res; config.creater = AccountManager.get().secret; var r = request.post(aicsConfig.host + '/project/create?' + qs.stringify(config), function(err, httpResponse, body) { console.log(body); }); }) }