UNPKG

@honor-minigame/cli

Version:

honor minigame pack cli

134 lines (118 loc) 3.97 kB
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 };