@honor-minigame/cli
Version:
honor minigame pack cli
134 lines (118 loc) • 3.97 kB
JavaScript
import fs from "fs-extra";
import path from "path";
import { fileURLToPath } from "url";
import chalk from "chalk";
import {
createPackagesDefinition,
allocateResourceToPackages,
buildProjectAndOutput,
} from "../process/index.js";
import { lsdirdeep } from "../common/utils.js";
import { SIGN_MODE } from "../common/constant.js";
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
async function sign(options = {}) {
// 判断是否有分包
let subpackageOptions;
if (options.subpackages && options.subpackages.length > 0) {
subpackageOptions = options.subpackages;
}
// 清空文件夹
fs.emptyDirSync(options.output);
// 获取签名
const signConfig = getProjectSignConfig(options);
// 获取项目文件
let files = resolveFiles(options.projectPath);
const { fullPackage, subPackages } = createPackagesDefinition(
options.package,
subpackageOptions,
options.icon
);
// 分配文件资源
allocateResourceToPackages(
files,
options.projectPath,
fullPackage,
subPackages
);
// 生成带签名的总包和分包buffer
const { rpkBuffer, subRpkBuffer } = await buildProjectAndOutput(
fullPackage,
subPackages,
signConfig
);
// 生成文件
if (rpkBuffer && !subRpkBuffer) {
generateDistFile(rpkBuffer, options, "rpk");
} else if (subRpkBuffer) {
generateDistFile(subRpkBuffer, options, "rpk");
}
}
/**
* 获取目录下的所有文件,去除签名文件、依赖包
*
* @param {String} base - 目标目录
* @returns {Array<String>|Boolean} - 文件列表
*/
function resolveFiles(base) {
let files = lsdirdeep(base);
return files.filter(
(item) => {
return path.extname(item) !== ".apk" && item !== 'package.json' && item !== 'package-lock.json'
}
);
}
/**
* 获取打包文件名称
* @param { Object } options
* @param { String } distExt 文件名后缀
*/
function getDistFilename(options, distExt) {
// return `${options.package}.${options.signMode}.${options.versionName}.${distExt}`
return `${options.package}.${distExt}`;
}
/**
* 把 zip/rpk 文件写到磁盘
*
* @param {Buffer} buffer - rpk(zip)buffer
* @param {Object} options - 文件参数
* @param {String} options.name - 包名
* @param {String} options.output - dist 文件夹路径
* @param {String} options.signMode 签名模式
* @param {('zip'|'rpk')} distExt - 文件后缀
*/
function generateDistFile(buffer, options, distExt) {
const distName = getDistFilename(options, distExt);
const distFile = path.join(options.output, distName);
fs.writeFileSync(distFile, buffer);
console.info(chalk.green(`### HONOR PACK ### ${distName}`));
console.info("### HONOR PACK ### 打包成功!");
}
function getProjectSignConfig(options) {
const signPath =
options.signMode === SIGN_MODE.RELEASE ? "sign/release" : "sign/debug";
let privatePath = path.resolve(options.projectPath, signPath, "private.pem");
let certificatePath = path.resolve(
options.projectPath,
signPath,
"certificate.pem"
);
if (!fs.existsSync(privatePath) || !fs.existsSync(certificatePath)) {
if (options.signMode === SIGN_MODE.RELEASE) {
// 不存在生产签名, 抛异常
throw new Error(`### HONOR PACK ### 缺少release签名文件`);
} else {
// 如果是debug模式,不存在签名 则使用内置签名
console.log("### HONOR PACK ### 使用内置签名文件");
privatePath = path.join(__dirname, "../sign/pem/private.pem");
certificatePath = path.join(__dirname, "../sign/pem/certificate.pem");
}
}
const privatekey = fs.readFileSync(privatePath);
const certificate = fs.readFileSync(certificatePath);
return {
privatekey: privatekey,
certificate: certificate,
};
}
export { sign };