146 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
		
		
			
		
	
	
			146 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * @Author: liyxt
							 | 
						||
| 
								 | 
							
								 * @Date: 2019-12-09 19:54:41
							 | 
						||
| 
								 | 
							
								 * @LastEditors  : liyxt
							 | 
						||
| 
								 | 
							
								 * @LastEditTime : 2019-12-31 09:44:54
							 | 
						||
| 
								 | 
							
								 * @Description: file content
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								const configJSON = require('../config.json');
							 | 
						||
| 
								 | 
							
								const fs = require('fs');
							 | 
						||
| 
								 | 
							
								const { resolve, join, sep } = require('path');
							 | 
						||
| 
								 | 
							
								const { spawn } = require('child_process');
							 | 
						||
| 
								 | 
							
								const yazl = require('yazl');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var zipfile = new yazl.ZipFile();
							 | 
						||
| 
								 | 
							
								var patchConfig = configJSON.patch || {};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// 先删除dist目录
							 | 
						||
| 
								 | 
							
								delDir('./dist');
							 | 
						||
| 
								 | 
							
								delDir('./patch');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								let folderSet = new Set();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// windows下npm执行名不同
							 | 
						||
| 
								 | 
							
								const ls = spawn(process.platform === 'win32' ? 'npm.cmd' : 'npm', [
							 | 
						||
| 
								 | 
							
									'run',
							 | 
						||
| 
								 | 
							
									'test',
							 | 
						||
| 
								 | 
							
									'--isPatch',
							 | 
						||
| 
								 | 
							
									...(patchConfig.path || []).map(e => '--env.buildPath=' + e)
							 | 
						||
| 
								 | 
							
								]);
							 | 
						||
| 
								 | 
							
								ls.stdout.on('data', data => {
							 | 
						||
| 
								 | 
							
									if (data.includes('ERROR')) {
							 | 
						||
| 
								 | 
							
										throw new Error(data);
							 | 
						||
| 
								 | 
							
									} else {
							 | 
						||
| 
								 | 
							
										data && console.log(`${data}`);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								ls.stderr.on('data', data => {
							 | 
						||
| 
								 | 
							
									if (data.includes('ERROR')) {
							 | 
						||
| 
								 | 
							
										throw new Error(data);
							 | 
						||
| 
								 | 
							
									} else {
							 | 
						||
| 
								 | 
							
										data && console.log(`${data}`);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								ls.on('close', code => {
							 | 
						||
| 
								 | 
							
									folderSet.clear();
							 | 
						||
| 
								 | 
							
									// 加入到zip入口
							 | 
						||
| 
								 | 
							
									addEntry(resolve(__dirname, '../dist'));
							 | 
						||
| 
								 | 
							
									// 动态修改xml
							 | 
						||
| 
								 | 
							
									let xmlconfig = {
							 | 
						||
| 
								 | 
							
										id: uuid(),
							 | 
						||
| 
								 | 
							
										provider: patchConfig.provider,
							 | 
						||
| 
								 | 
							
										department: patchConfig.department,
							 | 
						||
| 
								 | 
							
										needRecreatedLoginJar: false,
							 | 
						||
| 
								 | 
							
										needDeploy: false,
							 | 
						||
| 
								 | 
							
										time: dateFormat('YYYY-mm-dd HH:MM:SS', new Date()),
							 | 
						||
| 
								 | 
							
										patchKey: [...folderSet].join(',')
							 | 
						||
| 
								 | 
							
									};
							 | 
						||
| 
								 | 
							
									let xml = fs.readFileSync(resolve(__dirname, '../config/packmetadata.xml'), 'utf-8');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									Object.entries(xmlconfig).forEach(([key, value]) => {
							 | 
						||
| 
								 | 
							
										xml = xml.replace(`<!-- ${key} -->`, `<${key}>${value}</${key}>`);
							 | 
						||
| 
								 | 
							
									});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									fs.writeFileSync(resolve(__dirname, '../dist/packmetadata.xml'), xml, 'utf-8');
							 | 
						||
| 
								 | 
							
									zipfile.addFile('./dist/packmetadata.xml', 'packmetadata.xml');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									zipfile.outputStream.pipe(fs.createWriteStream(`patch_${new Date().getTime()}.zip`)).on('close', function() {
							 | 
						||
| 
								 | 
							
										console.log('补丁已出!');
							 | 
						||
| 
								 | 
							
									});
							 | 
						||
| 
								 | 
							
									zipfile.end();
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function delDir(path) {
							 | 
						||
| 
								 | 
							
									let files = [];
							 | 
						||
| 
								 | 
							
									if (fs.existsSync(path)) {
							 | 
						||
| 
								 | 
							
										files = fs.readdirSync(path);
							 | 
						||
| 
								 | 
							
										files.forEach(file => {
							 | 
						||
| 
								 | 
							
											let curPath = path + '/' + file;
							 | 
						||
| 
								 | 
							
											if (fs.statSync(curPath).isDirectory()) {
							 | 
						||
| 
								 | 
							
												delDir(curPath); //递归删除文件夹
							 | 
						||
| 
								 | 
							
											} else {
							 | 
						||
| 
								 | 
							
												fs.unlinkSync(curPath); //删除文件
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										});
							 | 
						||
| 
								 | 
							
										fs.rmdirSync(path);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function uuid() {
							 | 
						||
| 
								 | 
							
									var s = [];
							 | 
						||
| 
								 | 
							
									var hexDigits = '0123456789abcdef';
							 | 
						||
| 
								 | 
							
									for (var i = 0; i < 36; i++) {
							 | 
						||
| 
								 | 
							
										s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									s[14] = '4'; // bits 12-15 of the time_hi_and_version field to 0010
							 | 
						||
| 
								 | 
							
									s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1); // bits 6-7 of the clock_seq_hi_and_reserved to 01
							 | 
						||
| 
								 | 
							
									s[8] = s[13] = s[18] = s[23] = '-';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									var uuid = s.join('');
							 | 
						||
| 
								 | 
							
									return uuid;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function addEntry(prefix = './dist') {
							 | 
						||
| 
								 | 
							
									//读取目录
							 | 
						||
| 
								 | 
							
									var paths = fs.readdirSync(prefix);
							 | 
						||
| 
								 | 
							
									paths.forEach(function(path) {
							 | 
						||
| 
								 | 
							
										var from = join(prefix, path);
							 | 
						||
| 
								 | 
							
										var st = fs.statSync(from);
							 | 
						||
| 
								 | 
							
										if (st.isFile()) {
							 | 
						||
| 
								 | 
							
											let folder = '/hotwebs/nccloud/resources/' + prefix.split(`${sep}dist${sep}`)[1];
							 | 
						||
| 
								 | 
							
											if (!folder.includes('__SOURCE__CODE__')) {
							 | 
						||
| 
								 | 
							
												folderSet.add(folder);
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											folder = join('replacement', folder);
							 | 
						||
| 
								 | 
							
											zipfile.addFile(from, join(folder, path));
							 | 
						||
| 
								 | 
							
											if (!folder.includes('__SOURCE__CODE__')) {
							 | 
						||
| 
								 | 
							
												zipfile.addFile(resolve(__dirname, 'ncc_patch'), join(folder, 'ncc_patch'));
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										} else if (st.isDirectory()) {
							 | 
						||
| 
								 | 
							
											addEntry(from);
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									});
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function dateFormat(fmt, date) {
							 | 
						||
| 
								 | 
							
									let ret;
							 | 
						||
| 
								 | 
							
									let opt = {
							 | 
						||
| 
								 | 
							
										'Y+': date.getFullYear().toString(), // 年
							 | 
						||
| 
								 | 
							
										'm+': (date.getMonth() + 1).toString(), // 月
							 | 
						||
| 
								 | 
							
										'd+': date.getDate().toString(), // 日
							 | 
						||
| 
								 | 
							
										'H+': date.getHours().toString(), // 时
							 | 
						||
| 
								 | 
							
										'M+': date.getMinutes().toString(), // 分
							 | 
						||
| 
								 | 
							
										'S+': date.getSeconds().toString() // 秒
							 | 
						||
| 
								 | 
							
										// 有其他格式化字符需求可以继续添加,必须转化成字符串
							 | 
						||
| 
								 | 
							
									};
							 | 
						||
| 
								 | 
							
									for (let k in opt) {
							 | 
						||
| 
								 | 
							
										ret = new RegExp('(' + k + ')').exec(fmt);
							 | 
						||
| 
								 | 
							
										if (ret) {
							 | 
						||
| 
								 | 
							
											fmt = fmt.replace(ret[1], ret[1].length == 1 ? opt[k] : opt[k].padStart(ret[1].length, '0'));
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									return fmt;
							 | 
						||
| 
								 | 
							
								}
							 |