@yuebai008/cli
Version:
Command line interface for rapid qg-minigame development
195 lines (157 loc) • 12.5 kB
JavaScript
;var _typeof = require("@babel/runtime-corejs2/helpers/typeof");var _WeakMap = require("@babel/runtime-corejs2/core-js/weak-map");var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs2/core-js/object/get-own-property-descriptor");var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");_Object$defineProperty(exports, "__esModule", { value: true });exports["default"] = zipPack;var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs2/regenerator"));var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/toConsumableArray"));var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/asyncToGenerator"));var _path = _interopRequireDefault(require("path"));
var _index = require("../../cli-shared-utils/index.js");
var paths = _interopRequireWildcard(require("../lib/paths.js"));
var _manifest = require("../lib/manifest.js");
var _constanst = require("../lib/constanst.js");
var _readdir = _interopRequireDefault(require("../lib/readdir.js"));
var _rpk = _interopRequireDefault(require("../lib/rpk.js"));
var _nodeForge = _interopRequireDefault(require("node-forge"));function _getRequireWildcardCache(e) {if ("function" != typeof _WeakMap) return null;var r = new _WeakMap(),t = new _WeakMap();return (_getRequireWildcardCache = function _getRequireWildcardCache(e) {return e ? t : r;})(e);}function _interopRequireWildcard(e, r) {if (!r && e && e.__esModule) return e;if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e };var t = _getRequireWildcardCache(r);if (t && t.has(e)) return t.get(e);var n = { __proto__: null },a = _Object$defineProperty && _Object$getOwnPropertyDescriptor;for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) {var i = a ? _Object$getOwnPropertyDescriptor(e, u) : null;i && (i.get || i.set) ? _Object$defineProperty(n, u, i) : n[u] = e[u];}return n["default"] = e, t && t.set(e, n), n;}
// 生成签名文件
function generateReleaseSign(_x, _x2) {return _generateReleaseSign.apply(this, arguments);}function _generateReleaseSign() {_generateReleaseSign = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee(signFile, packageName) {var cachePath, manifest, privateFile, certificateFile, organizationName, commonName, countryName, stateName, localityName, keys, cert, certObj, pemPrivateKey, pemCertificate, dirPath;return _regenerator["default"].wrap(function _callee$(_context) {while (1) switch (_context.prev = _context.next) {case 0:
cachePath = _path["default"].join(__dirname, '../../../node_modules', packageName);
// 读取manifest配置
manifest = (0, _manifest.get)();
// 判断本地是否有缓存
_context.prev = 2;
privateFile = _path["default"].join(cachePath, 'private.pem');
certificateFile = _path["default"].join(cachePath, 'certificate.pem');if (!(
_index.fs.existsSync(privateFile) && _index.fs.existsSync(certificateFile))) {_context.next = 10;break;}
(0, _index.info)("\n####\u68C0\u6D4B\u5230".concat(cachePath, "\u8DEF\u5F84\u4E0B\u6709release\u7B7E\u540D\u7F13\u5B58####"));
// 自动使用缓存
_index.fs.copySync(privateFile, signFile.privatekey);
_index.fs.copySync(certificateFile, signFile.certificate);return _context.abrupt("return");case 10:_context.next = 15;break;case 12:_context.prev = 12;_context.t0 = _context["catch"](2);
console.error(_context.t0);case 15:
// 使用rl.question()方法从命令行读取证书请求参数
(0, _index.info)('\n本地检测到未包含release签名,正在生成release签名信息...');
organizationName = manifest.name;
// 使用包名作为名称
commonName = packageName;
countryName = 'CN';
stateName = 'ZJ';
localityName = 'HZ';
// 生成RSA密钥对
keys = _nodeForge["default"].pki.rsa.generateKeyPair(2048);
// 创建证书
cert = _nodeForge["default"].pki.createCertificate();
cert.publicKey = keys.publicKey;
cert.serialNumber = '01';
cert.validity.notBefore = new Date();
cert.validity.notAfter = new Date();
cert.validity.notAfter.setFullYear(cert.validity.notBefore.getFullYear() + 10);
certObj = [
{ name: 'commonName', value: commonName },
{ name: 'countryName', value: countryName },
{ shortName: 'ST', value: stateName },
{ name: 'localityName', value: localityName },
{ name: 'organizationName', value: organizationName },
{ shortName: 'OU', value: 'MINIGAME' }];
cert.setSubject(certObj);
(0, _index.info)('release签名参数为:');
console.log(certObj);
cert.setIssuer(cert.subject.attributes);
cert.setExtensions([
{ name: 'basicConstraints', cA: true },
{ name: 'keyUsage', digitalSignature: true, keyCertSign: true, cRLSign: true }]
);
cert.sign(keys.privateKey);
// 将密钥和证书保存到文件中
pemPrivateKey = _nodeForge["default"].pki.privateKeyToPem(keys.privateKey);
pemCertificate = _nodeForge["default"].pki.certificateToPem(cert);
// 如果release路径不存在
dirPath = _path["default"].dirname(signFile.privatekey);
if (!_index.fs.existsSync(dirPath)) {
_index.fs.mkdirSync(dirPath, { recursive: true });
}
(0, _index.info)("####\u7B7E\u540D\u751F\u6210\u6210\u529F####\uFF0C\u5199\u5165\u7B7E\u540Dprivatekey\uFF1A".concat(signFile.privatekey));
_index.fs.writeFileSync(signFile.privatekey, pemPrivateKey);
(0, _index.info)("\u5199\u5165\u7B7E\u540Dcertificate\uFF1A".concat(signFile.certificate, "\n"));
_index.fs.writeFileSync(signFile.certificate, pemCertificate);
// 缓存release签名到本地
try {
if (!_index.fs.existsSync(cachePath)) {
_index.fs.mkdirSync(cachePath, { recursive: true });
_index.fs.writeFileSync(_path["default"].join(cachePath, 'private.pem'), pemPrivateKey);
_index.fs.writeFileSync(_path["default"].join(cachePath, 'certificate.pem'), pemCertificate);
(0, _index.info)("####release\u7B7E\u540D\u9700\u8981\u4FDD\u5B58\u597D!!!#### \u8BE5\u6587\u4EF6\u5DF2\u7F13\u5B58\u5230\uFF1A".concat(cachePath, "\uFF0C\u82E5\u5FD8\u8BB0\u7B7E\u540D\uFF0C\u53EF\u5728\u6B64\u8DEF\u5F84\u4E0B\u67E5\u627E\u3002"));
}
} catch (err) {
console.error(err);
}case 44:case "end":return _context.stop();}}, _callee, null, [[2, 12]]);}));return _generateReleaseSign.apply(this, arguments);}function
zipPack(_x3, _x4, _x5, _x6, _x7, _x8, _x9) {return _zipPack.apply(this, arguments);}function _zipPack() {_zipPack = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee2(isRelease, packageName, singlePackage, subpackages, manifest, buildType, compileStartTime) {var signFiles, signFile, RPK_SIGNED_NEW, RPK_NEW, ext;return _regenerator["default"].wrap(function _callee2$(_context2) {while (1) switch (_context2.prev = _context2.next) {case 0:
// 签名文件
signFiles = {
debug: {
privatekey: paths.DEBUG_PRIVATE_KEY,
certificate: paths.DEBUG_CERTIFICATE
},
release: {
privatekey: paths.RELEASE_PRIVATE_KEY,
certificate: paths.RELEASE_CERTIFICATE
}
};
// 编译完成开始打包,打包前先校验签名文件是否存在
signFile = signFiles[isRelease ? 'release' : 'debug'];
// debug包的后缀 .rpk release包的后缀 .signed.rpk
// buildType 默认值为release
RPK_SIGNED_NEW = _constanst.RPK_SIGNED;
RPK_NEW = _constanst.RPK;
if (buildType && !buildType.includes('release')) {
RPK_SIGNED_NEW = ".".concat(buildType).concat(_constanst.RPK_SIGNED);
RPK_NEW = ".".concat(buildType).concat(_constanst.RPK);
}
ext = isRelease ? RPK_SIGNED_NEW : RPK_NEW;
/**
* 如果本地不存在release签名文件,则自动帮助cp生成release签名文件
*/if (!
isRelease) {_context2.next = 10;break;}if (!(
!_index.fs.existsSync(signFile.privatekey) || !_index.fs.existsSync(signFile.certificate))) {_context2.next = 10;break;}_context2.next = 10;return (
generateReleaseSign(signFile, packageName));case 10:if (
_index.fs.existsSync(signFile.privatekey)) {_context2.next = 12;break;}throw (
new Error("".concat(_constanst.LOG_TITLE, "\u7F3A\u5C11\u79C1\u94A5\u6587\u4EF6, \u6253\u5305\u5931\u8D25: ").concat(signFile.privatekey)));case 12:if (
_index.fs.existsSync(signFile.certificate)) {_context2.next = 14;break;}throw (
new Error("".concat(_constanst.LOG_TITLE, "\u7F3A\u5C11\u8BC1\u4E66\u6587\u4EF6, \u6253\u5305\u5931\u8D25: ").concat(signFile.certificate)));case 14:return _context2.abrupt("return",
new _promise["default"](function (resolve) {
(0, _index.info)("".concat(_constanst.LOG_TITLE).concat(singlePackage ? '原整包编译完成,开始生成原整包' : '分包编译完成,开始生成分包', " \u8017\u65F6\uFF1A").concat(new Date().valueOf() - compileStartTime, "ms"));
// 遍历出build目录所有文件
var files = (0, _readdir["default"])(paths.BUILD);
// 如果是打原整包
if (singlePackage) {
// 打原整包到temp目录 有插件包的也走这个逻辑,因为需要打个兼容的包
(0, _rpk["default"])("".concat(packageName).concat(_constanst.RPK), files, paths.BUILD, paths.TEMP, signFile, manifest).then(resolve);
} else {
// 如果存在分包,那么就打出各个分包,并和原整包一起再打一个rpk,到dist目录
var pkgRes = [];
// 根据分包配置,找到各个包对应的资源。执行如下操作后,files中剩下的即为主包的资源
subpackages.forEach(function (_ref)
{var name = _ref.name,root = _ref.root;
var matchFiles = [];
for (var index = files.length - 1; index >= 0; index--) {
var file = files[index];
var _ext = _path["default"].extname(root);
if (_ext === '' && file.indexOf(root) === 0) {
// 如果是目录,校验路径
matchFiles.push(files.splice(index, 1)[0]);
} else if (_ext !== '' && (file === root || file === "".concat(root, ".map"))) {
// 如果是文件,校验是否为 xxx.js 和 xxx.js.map
matchFiles.push(files.splice(index, 1)[0]);
}
}
pkgRes.push({
name: name,
matchFiles: matchFiles
});
});
// 打各个分包
var rpkPromise = pkgRes.map(function (_ref2)
{var name = _ref2.name,matchFiles = _ref2.matchFiles;
return (0, _rpk["default"])("".concat(name).concat(_constanst.RPK), matchFiles, paths.BUILD, paths.TEMP, signFile);
});
var promiseArr = [(0, _rpk["default"])("".concat(_constanst.MAIN).concat(_constanst.RPK), files, paths.BUILD, paths.TEMP, signFile, manifest)];
// 分包都打好后,连原整包一起打一个整包
_promise["default"].all([].concat((0, _toConsumableArray2["default"])(rpkPromise), promiseArr)).then(function () {
(0, _rpk["default"])("".concat(packageName).concat(ext), (0, _readdir["default"])(paths.TEMP), paths.TEMP, paths.DIST, signFile).then(function () {
resolve();
});
});
}
}));case 15:case "end":return _context2.stop();}}, _callee2);}));return _zipPack.apply(this, arguments);}