UNPKG

10.3 kBJavaScriptView Raw
1var path = require('path');
2var fs = require('fs');
3var request = require('request');
4var qs = require('qs');
5var unzip = require('unzip');
6var walkSync = require('walk-sync');
7var md5 = require('md5');
8var archiver = require('archiver');
9var Tools = require('../lib/tools');
10var AccountManager = require('../lib/account');
11var chalk = require("chalk");
12var argv = require('minimist')(process.argv.slice(2));
13var Promise = require("bluebird");
14
15module.exports = PackageManager;
16
17function PackageManager() {}
18PackageManager.showPackages = function(params) {
19 var packges = Tools.getAics();
20 var str = JSON.stringify(packges);
21 str = str.replace('{', "").replace('}', "").replace(/\"/g, "").replace(/\,/g, "\n").replace(/\:(\d+\.\d+\.\d+)/g, "@$1");
22 console.log("Packages has been Installed: ");
23 console.log(str);
24}
25PackageManager.init = function(argument) {
26 var projectName = argv._.pop();
27 fs.stat('.aics', function(err, stats) {
28 if (!stats) {
29 fs.mkdir('.aics');
30 }
31 var packageJson = require(path.resolve(__dirname, '../json/package.json'));
32 packageJson.name = AccountManager.get().username + ":" + projectName;
33 fs.writeFile('.aics/' + projectName + '.depot.json', JSON.stringify(packageJson, null, 2), 'utf8', function(err) {
34 if (err) {
35 console.log('写入 .aics/' + projectName + '.depot.json 错误')
36 };
37 console.log('创建 .aics/' + projectName + '.depot.json 成功.')
38 fs.writeFile('README.md', "## " + projectName, 'utf8', function(err) {
39 if (err) {
40 console.log('写入 README.md 错误')
41 } else {
42 console.log('创建 README.md 成功.')
43 }
44 });
45 });
46 })
47}
48PackageManager.remove = function(params) {
49 var packageName = argv._.pop();
50 var packTmpPath = packageName.replace(":", '/');
51 var fulPath = '.aics/tmp/' + packTmpPath;
52 var modifyArray = [];
53 //读取.aics目录
54 !Tools.isExist(path.resolve(fulPath), true) ? (process.exit(0)) : "";
55
56 var tmpTrees = walkSync(path.resolve(fulPath), {
57 directories: false
58 });
59
60 for (var i = tmpTrees.length - 1; i >= 0; i--) {
61 if (tmpTrees[i].indexOf('.zip') > 0) {
62 continue;
63 }
64 console.log("comparing - " + tmpTrees[i]);
65 var org = Tools.isExist(fulPath + "/" + tmpTrees[i]) && fs.readFileSync(fulPath + "/" + tmpTrees[i])
66 var orgmd5 = md5(org);
67 var tar = Tools.isExist(tmpTrees[i], false) && fs.readFileSync(tmpTrees[i])
68 var tarmd5 = md5(tar);
69 if (tarmd5 == orgmd5) {
70 console.log((tmpTrees[i]) + " no modify.")
71 } else {
72 Tools.isExist(tmpTrees[i], true) ? (
73 console.log(chalk.red.bold(tmpTrees[i]) + " has been modify. "),
74 modifyArray.push(tmpTrees[i])
75 ) : "";
76 }
77 }
78 console.log("Compare Complate!");
79 if (modifyArray.length < 1) {
80 for (var i = tmpTrees.length - 1; i >= 0; i--) {
81 if (tmpTrees[i].indexOf('.zip') > 0) {
82 continue;
83 }
84 var isExist = fs.existsSync(tmpTrees[i]);
85 if (isExist) {
86 fs.unlinkSync(tmpTrees[i]);
87 console.log('Remove ' + tmpTrees[i] + " Complate.");
88
89 }
90 }
91 Tools.confRemove(packageName);
92 } else {
93 for (var i = modifyArray.length - 1; i >= 0; i--) {
94 console.log(chalk.red.bold(modifyArray[i]) + ' Has been Modify,Remove Manually')
95 }
96 }
97}
98PackageManager.publish = function(params) {
99 var trees = walkSync(path.resolve(".aics"), {
100 globs: ['**/*.json'],
101 directories: false
102 });
103
104 var depots = "";
105 for (var i = 0; i < trees.length; i++) {
106 trees[i].indexOf('.depot.json') >= 0 ? (depots += trees[i].split(".").shift() + ",") : ""
107 }
108 if (argv._.length < 2) {
109 console.log("参数错误.可发布的代码包: " + depots)
110 return;
111 }
112
113 var configPath = path.resolve('.aics/' + argv._.pop() + '.depot.json');
114 fs.stat(configPath, function(err, stats) {
115 if (err) console.log('可发布的代码包:' + depots)
116 });
117
118 var config = require(configPath);
119 if (!preBuild(config)) {
120 process.exit(1);
121 }
122 var account = AccountManager.get();
123 config.secret = account.email;
124 //验证是否可发布
125 request.post({ url: process.env.AICS_HOST + '/package/verify', body: config, json: true }, function(err, httpResponse, body) {
126 process.stdout.write('\n校验组件信息....\n');
127 if (body.code > 0) {
128 console.log(body.msg + '\n');
129 console.log('编译组件....');
130 if (!!body.data) {
131 console.log(typeof body.data.pid);
132 config.targetId = body.data.pid;
133 } else {
134 console.log("未知错误,请稍后再试");
135 return;
136 }
137 //没有问题则发布包
138 buildZip(config, function(path) {
139 var r = request.post(process.env.AICS_HOST + '/package/upload', function optionalCallback(err, httpResponse, body) {
140 console.log(body.code > 0 ? "发布成功" : '发布失败');
141 })
142 var form = r.form();
143 form.append('zip', fs.createReadStream(path));
144 })
145 } else {
146 console.log(body.msg);
147 }
148 })
149}
150
151preBuild = function(config) {
152 if (config.files.length <= 0) {
153 console.log('空的组件,请检查后重新上传');
154 return false;
155 }
156 return true;
157}
158afterBuild = function(config) {
159
160}
161
162buildZip = function(config, cb) {
163 if (!configCheck(config)) {
164 console.log(chalk.red.bold("\n配置文件出错.\n"));
165 return;
166 }
167 var depotPath = config.name.split(':');
168 var tmppath = Tools.mkdir(path.resolve(".aics") + "/tmp/" + depotPath.join('/'));
169 var zipPath = tmppath + '/' + config.targetId + '.zip';
170
171 var files = config.files;
172 var packages = config.packages;
173 var tmpArr = [];
174 tmpArr.push("\n\n# imports froms " + config.name);
175 packages = tmpArr.concat(packages).join('\n');
176 var output = fs.createWriteStream(zipPath);
177 output.on('close', function() {
178 console.log('编译完成...\n');
179 cb(zipPath);
180 });
181
182 //生成archiver对象,打包类型为zip
183 var zipArchiver = archiver('zip');
184
185 //将打包对象与输出流关联
186 zipArchiver.pipe(output);
187
188 if (!files.length) {
189 console.log('\n组件必须包含文件,程序退出.\n');
190 process.exit(1);
191 }
192 for (var i = 0; i < files.length; i++) {
193 console.log((" + ") + files[i]);
194 if (!fs.existsSync(path.resolve(files[i]))) {
195 console.log("没有找到文件 \n " + config.name + " --> " + files[i]);
196 process.exit(1);
197 }
198 //将被打包文件的流添加进archiver对象中
199 zipArchiver.append(fs.createReadStream(files[i]), {
200 'name': files[i]
201 });
202 }
203 //add packages to zip
204 zipArchiver.append(new Buffer(packages), {
205 'name': 'packages'
206 });
207 //打包
208 zipArchiver.finalize();
209}
210upload = function(path) {
211
212 }
213 // publishToDepot = function(config, depotConfigPath) {
214 // var depotPath = config.name.split(':');
215 // var tmppath = Tools.mkdir(path.resolve(".aics") + "/tmp/" + depotPath.join('/'));
216 // var zipPath = tmppath + '/build.zip';
217
218// var account = AccountManager.get();
219// var files = config.files;
220// var packages = config.meteor.packages;
221// var tmpArr = [];
222// tmpArr.push("\n\n# imports froms " + config.name);
223// packages = tmpArr.concat(packages).join('\n');
224// // var packages
225// var output = fs.createWriteStream(zipPath);
226// output.on('close', function() {
227// config.name = config.name.replace("$", ":");
228// var r = request.post(process.env.AICS_HOST + '/package/upload', function(err, httpResponse, body) {
229// console.log(httpResponse)
230// fs.unlinkSync(zipPath);
231// });
232// var form = r.form();
233// if (!account.email) {
234// console.log("账户未设置.")
235// return;
236// }
237// config.secret = account.email
238// config.markdown = "";
239// if (fs.existsSync(path.resolve(config.documentation))) {
240// config.markdown = fs.readFileSync(path.resolve(config.documentation), { encoding: 'utf8' });
241// }
242// form.append('config', JSON.stringify(config));
243// form.append('zip', fs.createReadStream(path.resolve(zipPath)));
244// });
245// }
246
247PackageManager.addfile = function(name, file) {
248 if (!name || !file) {
249 console.log('\nerror.\n');
250 console.log('Useage:');
251 console.log(' aics addfile packageName file[dir]\n');
252 return;
253 }
254
255 var config = null,
256 trees = [];
257 try {
258 var paths = path.resolve('.aics/' + name + '.depot.json');
259 var states = fs.statSync(paths);
260 if (states) {
261 config = require(paths);
262 }
263 } catch (e) {
264 console.log("代码包配置文件不存在.");
265 return;
266 }
267
268 try {
269 var states = fs.statSync(file);
270 if (states) {
271 if (states.isDirectory()) {
272 var trees = walkSync(file, {
273 directories: false
274 });
275 for (var i = trees.length - 1; i >= 0; i--) {
276 trees[i] = file + "/" + trees[i];
277 };
278 config.files = config.files.concat(trees);
279 } else {
280 config.files = config.files.concat(file);
281 }
282
283 config.files = Array.from(new Set(config.files));
284 fs.writeFile(path.resolve('.aics/' + name + '.depot.json'), JSON.stringify(config, null, 2), 'utf8', function(err) {
285 if (err) {
286 console.log(err);
287 } else {
288 console.log("\nComplate!\n");
289 }
290 });
291 }
292 } catch (e) {
293 console.log(file + "不存在.");
294 return;
295 }
296
297}
298PackageManager.files = function(name) {
299 if (!name) {
300 console.log('\nerror.\n');
301 console.log('Useage:');
302 console.log('aics files packagename\n');
303 return;
304 }
305
306 try {
307 var paths = path.resolve('.aics/' + name + '.depot.json');
308 var states = fs.statSync(paths);
309 if (states) {
310 config = require(paths);
311 config.files.map(function(file) {
312 console.log(util.inspect(file, {
313 colors: true
314 }));
315 })
316 }
317 } catch (e) {
318 console.log("代码包配置文件不存在.");
319 return;
320 }
321}
322configCheck = function(config) {
323 if (!config.stack) {
324 console.log("package belong to some stack");
325 return false;
326 }
327 if (!config.name) {
328 console.log("package need a name");
329 return false;
330 }
331 if (!config.version) {
332 console.log("package need a version");
333 return false;
334 }
335 if (!config.files) {
336 console.log("package need a files list");
337 return false;
338 }
339
340 return true;
341}