cocos-creator-multiplayer/examples/layaair/frontend/.laya/publish_xmgame.js
2021-07-21 23:11:13 +08:00

379 lines
14 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// v1.8.2
const ideModuleDir = global.ideModuleDir;
const workSpaceDir = global.workSpaceDir;
//引用插件模块
const gulp = require(ideModuleDir + "gulp");
const fs = require("fs");
const path = require("path");
const childProcess = require("child_process");
const del = require(ideModuleDir + "del");
const revCollector = require(ideModuleDir + 'gulp-rev-collector');
let copyLibsTask = ["copyPlatformLibsJsFile"];
let versiontask = ["version2"];
let
config,
releaseDir,
tempReleaseDir, // 小米临时拷贝目录
projDir; // 小米快游戏工程目录
let versionCon; // 版本管理version.json
let commandSuffix,
opensslPath,
layarepublicPath;
// 创建小米项目前拷贝小米引擎库、修改index.js
gulp.task("preCreate_XM", copyLibsTask, function() {
releaseDir = global.releaseDir;
config = global.config;
commandSuffix = global.commandSuffix;
opensslPath = global.opensslPath;
layarepublicPath = global.layarepublicPath;
tempReleaseDir = global.tempReleaseDir;
});
gulp.task("copyPlatformFile_XM", ["preCreate_XM"], function() {
let xmAdapterPath = path.join(layarepublicPath, "LayaAirProjectPack", "lib", "data", "xmfiles");
let copyLibsList = [`${xmAdapterPath}/**/*.*`];
var stream = gulp.src(copyLibsList);
return stream.pipe(gulp.dest(tempReleaseDir));
});
gulp.task("createProj_XM", versiontask, function() {
releaseDir = path.dirname(releaseDir);
projDir = path.join(releaseDir, config.xmInfo.projName);
// 如果有即存项目,不再新建
let isProjExist = fs.existsSync(projDir + "/node_modules") &&
fs.existsSync(projDir + "/sign");
if (isProjExist) {
return;
}
// 在项目中创建小米项目
return new Promise((resolve, reject) => {
console.log("(proj)开始创建小米快游戏项目,请耐心等待(预计需要10分钟)...");
let cmd = `npx${commandSuffix}`;
let args = ["create-quickgame", config.xmInfo.projName, `path=${releaseDir}`,
`package=${config.xmInfo.package}`, `versionName=${config.xmInfo.versionName}`,
`versionCode=${config.xmInfo.versionCode}`, `minPlatformVersion=${config.xmInfo.minPlatformVersion}`,
`icon=/layaicon/${path.basename(config.xmInfo.icon)}`, `name=${config.xmInfo.name}`, `rebuild=true`];
let opts = {
shell: true
};
let cp = childProcess.spawn(cmd, args, opts);
cp.stdout.on('data', (data) => {
console.log(`stdout: ${data}`);
});
cp.stderr.on('data', (data) => {
console.log(`stderr: ${data}`);
// reject();
});
cp.on('close', (code) => {
console.log(`子进程退出码:${code}`);
resolve();
});
});
});
// 拷贝文件到小米快游戏
gulp.task("copyFileToProj_XM", ["createProj_XM"], function() {
// 将临时文件夹中的文件,拷贝到项目中去
let originalDir = `${tempReleaseDir}/**/*.*`;
let stream = gulp.src(originalDir);
return stream.pipe(gulp.dest(path.join(projDir)));
});
// 拷贝icon到小米快游戏
gulp.task("copyIconToProj_XM", ["copyFileToProj_XM"], function() {
let originalDir = config.xmInfo.icon;
let stream = gulp.src(originalDir);
return stream.pipe(gulp.dest(path.join(projDir, "layaicon")));
});
// 清除小米快游戏临时目录
gulp.task("clearTempDir_XM", ["copyIconToProj_XM"], function() {
// 删掉临时目录
return del([tempReleaseDir], { force: true });
});
// 生成release签名(私钥文件 private.pem 和证书文件 certificate.pem )
gulp.task("generateSign_XM", ["clearTempDir_XM"], function() {
if (!config.xmSign.generateSign) {
return;
}
// https://doc.quickapp.cn/tools/compiling-tools.html
return new Promise((resolve, reject) => {
let cmd = `${opensslPath}`;
let args = ["req", "-newkey", "rsa:2048", "-nodes", "-keyout", "private.pem",
"-x509", "-days", "3650", "-out", "certificate.pem"];
let opts = {
cwd: projDir,
shell: true
};
let cp = childProcess.spawn(cmd, args, opts);
cp.stdout.on('data', (data) => {
console.log(`stdout: ${data}`);
});
cp.stderr.on('data', (data) => {
console.log(`stderr: ${data}`);
data += "";
if (data.includes("Country Name")) {
cp.stdin.write(`${config.xmSign.countryName}\n`);
console.log(`Country Name: ${config.xmSign.countryName}`);
} else if (data.includes("Province Name")) {
cp.stdin.write(`${config.xmSign.provinceName}\n`);
console.log(`Province Name: ${config.xmSign.provinceName}`);
} else if (data.includes("Locality Name")) {
cp.stdin.write(`${config.xmSign.localityName}\n`);
console.log(`Locality Name: ${config.xmSign.localityName}`);
} else if (data.includes("Organization Name")) {
cp.stdin.write(`${config.xmSign.orgName}\n`);
console.log(`Organization Name: ${config.xmSign.orgName}`);
} else if (data.includes("Organizational Unit Name")) {
cp.stdin.write(`${config.xmSign.orgUnitName}\n`);
console.log(`Organizational Unit Name: ${config.xmSign.orgUnitName}`);
} else if (data.includes("Common Name")) {
cp.stdin.write(`${config.xmSign.commonName}\n`);
console.log(`Common Name: ${config.xmSign.commonName}`);
} else if (data.includes("Email Address")) {
cp.stdin.write(`${config.xmSign.emailAddr}\n`);
console.log(`Email Address: ${config.xmSign.emailAddr}`);
// cp.stdin.end();
}
// reject();
});
cp.on('close', (code) => {
console.log(`子进程退出码:${code}`);
// 签名是否生成成功
let
privatePem = path.join(projDir, "private.pem"),
certificatePem = path.join(projDir, "certificate.pem");
let isSignExits = fs.existsSync(privatePem) && fs.existsSync(certificatePem);
if (!isSignExits) {
throw new Error("签名生成失败,请检查!");
}
resolve();
});
});
});
// 拷贝sign文件到指定位置
gulp.task("copySignFile_XM", ["generateSign_XM"], function() {
if (config.xmSign.generateSign) { // 新生成的签名
// 移动签名文件到项目中Laya & 小米快游戏项目中)
let
privatePem = path.join(projDir, "private.pem"),
certificatePem = path.join(projDir, "certificate.pem");
let isSignExits = fs.existsSync(privatePem) && fs.existsSync(certificatePem);
if (!isSignExits) {
return;
}
let
xiaomiDest = `${projDir}/sign/release`,
layaDest = `${workSpaceDir}/sign/release`;
let stream = gulp.src([privatePem, certificatePem]);
return stream.pipe(gulp.dest(xiaomiDest))
.pipe(gulp.dest(layaDest));
} else if (config.xmInfo.useReleaseSign && !config.xmSign.generateSign) { // 使用release签名并且没有重新生成
// 从项目中将签名拷贝到小米快游戏项目中
let
privatePem = path.join(workSpaceDir, "sign", "release", "private.pem"),
certificatePem = path.join(workSpaceDir, "sign", "release", "certificate.pem");
let isSignExits = fs.existsSync(privatePem) && fs.existsSync(certificatePem);
if (!isSignExits) {
return;
}
let
xiaomiDest = `${projDir}/sign/release`;
let stream = gulp.src([privatePem, certificatePem]);
return stream.pipe(gulp.dest(xiaomiDest));
}
});
gulp.task("deleteSignFile_XM", ["copySignFile_XM"], function() {
if (config.xmSign.generateSign) { // 新生成的签名
let
privatePem = path.join(projDir, "private.pem"),
certificatePem = path.join(projDir, "certificate.pem");
return del([privatePem, certificatePem], { force: true });
}
});
gulp.task("modifyFile_XM", ["deleteSignFile_XM"], function() {
// 修改manifest.json文件
let manifestPath = path.join(projDir, "manifest.json");
if (!fs.existsSync(manifestPath)) {
return;
}
let manifestContent = fs.readFileSync(manifestPath, "utf8");
let manifestJson = JSON.parse(manifestContent);
manifestJson.package = config.xmInfo.package;
manifestJson.name = config.xmInfo.name;
manifestJson.orientation = config.xmInfo.orientation;
manifestJson.config.logLevel = config.xmInfo.logLevel || "off";
manifestJson.versionName = config.xmInfo.versionName;
manifestJson.versionCode = config.xmInfo.versionCode;
manifestJson.minPlatformVersion = config.xmInfo.minPlatformVersion;
manifestJson.icon = `/layaicon/${path.basename(config.xmInfo.icon)}`;
if (config.xmInfo.subpack) { // 分包
manifestJson.subpackages = config.xmSubpack;
// 检测分包目录是否有入口文件
console.log('检查分包文件...');
if (manifestJson.subpackages) {
for(let i = 0; i < manifestJson.subpackages.length; i ++) {
let conf = manifestJson.subpackages[i];
if (conf.root) {
let rootPath = path.join(projDir, conf.root);
if (!fs.existsSync(rootPath)) {
throw new Error(`分包文件/目录 ${rootPath} 不存在!`);
}
let jsIndex = rootPath.lastIndexOf('.js');
let jsPath = rootPath;
if (jsIndex < 0 || jsIndex != rootPath.length - 3) {
jsPath = path.join(rootPath, 'main.js');
}
if (!fs.existsSync(jsPath)) {
throw new Error(`分包文件/目录 ${jsPath} 不存在!`);
}
}
}
}
} else {
delete manifestJson.subpackages;
}
fs.writeFileSync(manifestPath, JSON.stringify(manifestJson, null, 4), "utf8");
if (config.version) {
let versionPath = projDir + "/version.json";
versionCon = fs.readFileSync(versionPath, "utf8");
versionCon = JSON.parse(versionCon);
}
let indexJsStr = (versionCon && versionCon["index.js"]) ? versionCon["index.js"] : "index.js";
// 修改main.js文件
let mainJsPath = path.join(projDir, "main.js");
let mainJsCon = fs.existsSync(mainJsPath) && fs.readFileSync(mainJsPath, "utf8");
let reWriteMainJs = !fs.existsSync(mainJsPath) || !mainJsCon.includes("xmmini");
if (reWriteMainJs) {
mainJsCon = 'require("./qg-adapter.js");\nrequire("./libs/laya.xmmini.js");\nrequire("./index.js");';
fs.writeFileSync(mainJsPath, mainJsCon, "utf8");
}
// 小米项目修改index.js
let filePath = path.join(projDir, indexJsStr);
if (!fs.existsSync(filePath)) {
return;
}
let fileContent = fs.readFileSync(filePath, "utf8");
fileContent = fileContent.replace(/loadLib(\(['"])/gm, "require$1./");
fs.writeFileSync(filePath, fileContent, "utf8");
})
gulp.task("modifyMinJs_XM", ["modifyFile_XM"], function() {
let fileJsPath = path.join(projDir, "main.js");
let content = fs.readFileSync(fileJsPath, "utf-8");
if (!config.useMinJsLibs) { // 默认保留了平台文件如果同时取消使用min类库就会出现文件引用不正确的问题
content = content.replace(/min\/laya(-[\w\d]+)?\.xmmini\.min\.js/gm, "laya.xmmini.js");
} else {
content = content.replace(/(min\/)?laya(-[\w\d]+)?\.xmmini(\.min)?\.js/gm, "min/laya.xmmini.min.js");
}
fs.writeFileSync(fileJsPath, content, 'utf-8');
});
gulp.task("version_XM", ["modifyMinJs_XM"], function () {
// main.js默认不覆盖如果同时开启版本管理就会出现文件引用不正确的问题
let fileJsPath = path.join(projDir, "main.js");
let content = fs.readFileSync(fileJsPath, "utf-8");
content = content.replace(/laya(-[\w\d]+)?\.xmmini/gm, "laya.xmmini");
content = content.replace(/index(-[\w\d]+)?\.js/gm, "index.js");
fs.writeFileSync(fileJsPath, content, 'utf-8');
if (config.version) {
let versionPath = projDir + "/version.json";
let mainJSPath = projDir + "/main.js";
let srcList = [versionPath, mainJSPath];
return gulp.src(srcList)
.pipe(revCollector())
.pipe(gulp.dest(projDir));
}
});
// 打包rpk
gulp.task("buildRPK_XM", ["version_XM"], function() {
// 在小米轻游戏项目目录中执行:
// npm run build || npm run release
let cmdStr = "build";
if (config.xmInfo.useReleaseSign) {
cmdStr = "release";
}
return new Promise((resolve, reject) => {
let cmd = `npm${commandSuffix}`;
let args = ["run", cmdStr];
let opts = {
cwd: projDir,
shell: true
};
let cp = childProcess.spawn(cmd, args, opts);
// let cp = childProcess.spawn(`npx${commandSuffix}`, ['-v']);
cp.stdout.on('data', (data) => {
console.log(`stdout: ${data}`);
});
cp.stderr.on('data', (data) => {
console.log(`stderr: ${data}`);
// reject();
});
cp.on('close', (code) => {
console.log(`子进程退出码:${code}`);
// rpk是否生成成功
let distRpkPath = path.join(projDir, "dist", `${config.xmInfo.package}${config.xmInfo.useReleaseSign ? ".release" : ".debug"}.rpk`);
if (!fs.existsSync(distRpkPath)) {
throw new Error("rpk生成失败请检查");
}
resolve();
});
});
});
gulp.task("showQRCode_XM", ["buildRPK_XM"], function() {
// 在小米轻游戏项目目录中执行:
// npm run server
return new Promise((resolve, reject) => {
let cmd = `npm${commandSuffix}`;
let args = ["run", "server"];
let opts = {
cwd: projDir,
shell: true
};
let cp = childProcess.spawn(cmd, args, opts);
// let cp = childProcess.spawn(`npx${commandSuffix}`, ['-v']);
cp.stdout.on('data', (data) => {
console.log(`${data}`);
// 输出pidmacos要用: macos无法kill进程树也无法执行命令获取3000端口pid(没有查询权限)导致无法kill这个进程
console.log('xm_qrcode_pid:' + cp.pid);
});
cp.stderr.on('data', (data) => {
console.log(`stderr: ${data}`);
// reject();
});
cp.on('close', (code) => {
console.log(`子进程退出码:${code}`);
resolve();
});
});
});
gulp.task("buildXiaomiProj", ["showQRCode_XM"], function() {
console.log("all tasks completed");
});