794 lines
29 KiB
JavaScript
794 lines
29 KiB
JavaScript
// v1.8.18
|
||
//是否使用IDE自带的node环境和插件,设置false后,则使用自己环境(使用命令行方式执行)
|
||
const useIDENode = process.argv[0].indexOf("LayaAir") > -1 ? true : false;
|
||
const useCMDNode = process.argv[1].indexOf("layaair2-cmd") > -1 ? true : false;
|
||
const pubLayame = process.argv.length >= 4 && process.argv[3].startsWith("--config") && process.argv[3].endsWith("layame.json");
|
||
function useOtherNode(){
|
||
return useIDENode||useCMDNode ||pubLayame;
|
||
}
|
||
//获取Node插件和工作路径
|
||
const ideModuleDir = useOtherNode() ? process.argv[1].replace("gulp\\bin\\gulp.js", "").replace("gulp/bin/gulp.js", "") : "";
|
||
const workSpaceDir = useOtherNode() ? process.argv[2].replace("--gulpfile=", "").replace("\\.laya\\publish.js", "").replace("/.laya/publish.js", "") + "/" : "./../";
|
||
global.ideModuleDir = ideModuleDir;
|
||
global.workSpaceDir = workSpaceDir;
|
||
//引用插件模块
|
||
const gulp = require(ideModuleDir + "gulp");
|
||
const fs = require("fs");
|
||
const path = require("path");
|
||
const childProcess = require("child_process");
|
||
const uglify = require(ideModuleDir + 'gulp-uglify-es').default;
|
||
const jsonminify = require(ideModuleDir + "gulp-jsonminify");
|
||
const image = require(ideModuleDir + "gulp-image");
|
||
const rev = require(ideModuleDir + "gulp-rev");
|
||
const revdel = require(ideModuleDir + "gulp-rev-delete-original");
|
||
const revCollector = require(ideModuleDir + 'gulp-rev-collector');
|
||
const del = require(ideModuleDir + "del");
|
||
const requireDir = require(ideModuleDir + 'require-dir');
|
||
const babel = require(ideModuleDir + 'gulp-babel');
|
||
|
||
// 结合compile.js使用
|
||
global.publish = true;
|
||
const fileList = ["compile.js", "pub_utils.js", "publish_xmgame.js", "publish_oppogame.js", "publish_vivogame.js", "publish_biligame.js",
|
||
"publish_alipaygame.js", "publish_wxgame.js", "publish_bdgame.js", "publish_qqgame.js", "publish_bytedancegame.js", "publish_hwgame.js",
|
||
"publish_taobaominiapp.js", "publish_youkugame.js", "publish_taobaowidget.js", "publish_layame.js"];
|
||
requireDir('./', {
|
||
filter: function (fullPath) {
|
||
// 只用到了compile.js和publish.js
|
||
if (fileList.includes(path.basename(fullPath))) {
|
||
return true;
|
||
} else {
|
||
return false;
|
||
}
|
||
}
|
||
});
|
||
|
||
const QUICKGAMELIST = ["xmgame", "oppogame", "vivogame", "hwgame"];
|
||
|
||
// 清理临时文件夹,加载配置
|
||
let config,
|
||
releaseDir,
|
||
binPath,
|
||
platform = "web",
|
||
isOpendataProj = false,
|
||
platformCopyTask = [],// 平台脚本拷贝任务
|
||
platformTask = [], // 平台需要执行的任务
|
||
commandSuffix = ".cmd",
|
||
adbPath = "adb",
|
||
opensslPath = "openssl";
|
||
let execTask;
|
||
//任务对照列表
|
||
const copyTasks = {
|
||
"layame": "copy",
|
||
"taobaowidget": "preCreate_TBWidget",
|
||
"youkugame": "copyPlatformFile_youku",
|
||
"taobaominiapp": "preCreate_TBMini",
|
||
"hwgame": "copyPlatformFile_HW",
|
||
"bytedancegame": "copyPlatformFile_ByteDance",
|
||
"biligame": "copyPlatformFile_Bili",
|
||
"Alipaygame": "copyPlatformFile_Alipay",
|
||
"vivogame": "copyPlatformFile_VIVO",
|
||
"oppogame": "copyPlatformFile_OPPO",
|
||
"xmgame": "copyPlatformFile_XM",
|
||
"bdgame": "copyPlatformFile_BD",
|
||
"qqgame": "copyPlatformFile_QQ",
|
||
"wxgame": "fitwasm_WX",
|
||
"web": "copyPlatformLibsJsFile"
|
||
}
|
||
const tasks = {
|
||
"layame": "buildLayaMeProj",
|
||
"taobaowidget": "buildTBWidgetProj",
|
||
"youkugame": "buildYKProj",
|
||
"taobaominiapp": "buildTBMiniProj",
|
||
"hwgame": "buildHWProj",
|
||
"bytedancegame": "buildByteDanceProj",
|
||
"biligame": "buildBiliProj",
|
||
"Alipaygame": "buildAlipayProj",
|
||
"vivogame": "buildVivoProj",
|
||
"oppogame": "buildOPPOProj",
|
||
"xmgame": "buildXiaomiProj",
|
||
"bdgame": "buildBDProj",
|
||
"qqgame": "buildQQProj",
|
||
"wxgame": "buildWXProj",
|
||
"web": "version2"
|
||
}
|
||
// 是否build指定部分(debug版本layame)
|
||
let buildOptions = null;
|
||
function toBuildPart(part) {
|
||
if (!buildOptions) {
|
||
return true;
|
||
}
|
||
if ('all' == part ) {
|
||
return buildOptions.type == 'all';
|
||
}
|
||
if (buildOptions.type == 'all') {
|
||
return true;
|
||
}
|
||
return (buildOptions.buildList.includes(part));
|
||
}
|
||
if (!useOtherNode() && process.argv.length > 5 && process.argv[4] == "--config") {
|
||
platform = process.argv[5].replace(".json", "");
|
||
}
|
||
if (useOtherNode() && process.argv.length >= 4 && process.argv[3].startsWith("--config") && process.argv[3].endsWith(".json")) {
|
||
platform = process.argv[3].match(/(\w+).json/)[1];
|
||
platformCopyTask.push(copyTasks[platform]);
|
||
platformTask.push(tasks[platform]);
|
||
execTask = process.argv[4];
|
||
}
|
||
let isDebugLayaMe = false;
|
||
gulp.task("loadConfig", function (cb) {
|
||
let _path;
|
||
if (!useOtherNode()) {
|
||
_path = platform + ".json";
|
||
releaseDir = "../release/" + platform;
|
||
binPath = "../bin/";
|
||
}
|
||
if (useOtherNode()) {
|
||
_path = path.join(workSpaceDir, ".laya", `${platform}.json`);
|
||
releaseDir = path.join(workSpaceDir, "release", platform).replace(/\\/g, "/");
|
||
binPath = path.join(workSpaceDir, "bin").replace(/\\/g, "/");
|
||
}
|
||
global.platform = platform;
|
||
let file = fs.readFileSync(_path, "utf-8");
|
||
if (file) {
|
||
if (platform == 'layame') {
|
||
let tmpconfig = JSON.parse(file);
|
||
if (tmpconfig.debugLayaMe) {
|
||
// 如本地调试版layame
|
||
releaseDir = path.join(workSpaceDir, 'layaMe').replace(/\\/g, "/");
|
||
isDebugLayaMe = true;
|
||
}
|
||
}
|
||
if ([...QUICKGAMELIST, "taobaominiapp", "taobaowidget"].includes(platform)) {
|
||
file = file.replace(/\$basePath/g, releaseDir + "/temprelease");
|
||
} else {
|
||
file = file.replace(/\$basePath/g, releaseDir);
|
||
}
|
||
config = JSON.parse(file);
|
||
global.config = config;
|
||
if (isDebugLayaMe) {
|
||
buildOptions = config.buildOptions;
|
||
}
|
||
// 我们遇到一个bug,当使用min库,同时开启es6toes5后,es6toes5时会将min库部分变量忽略,导致程序出错
|
||
// 我们原来的逻辑: 1) 将min库es6toes5 2) 将转换后的库重新压缩
|
||
// 所以,当使用min库同时开启es6toes5时,我们将: 1) 使用普通库 2) 开启js压缩
|
||
if (config.useMinJsLibs && config.es6toes5) {
|
||
config.useMinJsLibs = false;
|
||
config.compressJs = true;
|
||
}
|
||
}
|
||
// 是否是开放域项目
|
||
let projInfoPath = path.join(workSpaceDir, path.basename(workSpaceDir) + ".laya");
|
||
let isExist = fs.existsSync(projInfoPath);
|
||
if (isExist) {
|
||
try {
|
||
let projInfo = fs.readFileSync(projInfoPath, "utf8");
|
||
projInfo = projInfo && JSON.parse(projInfo);
|
||
isOpendataProj = projInfo.layaProType === 12;
|
||
} catch (e) {}
|
||
}
|
||
// 其他变量的初始化
|
||
let layarepublicPath = path.join(ideModuleDir, "../", "code", "layarepublic");
|
||
if (!fs.existsSync(layarepublicPath)) {
|
||
layarepublicPath = path.join(ideModuleDir, "../", "out", "layarepublic");
|
||
}
|
||
global.layarepublicPath = layarepublicPath;
|
||
|
||
if (process.platform === "darwin") {
|
||
commandSuffix = "";
|
||
}
|
||
global.commandSuffix = commandSuffix;
|
||
|
||
// 检查环境中是否存在adb和openssl
|
||
let otherLibsPath = path.join(layarepublicPath, "../", "vs", "layaEditor", "libs");
|
||
childProcess.exec("adb version", (error, stdout, stderr) => {
|
||
if (error) {
|
||
if (process.platform === "darwin") {
|
||
adbPath = path.join(otherLibsPath, "adb", "darwin", "adb");
|
||
} else {
|
||
adbPath = path.join(otherLibsPath, "adb", "win", "adb.exe");
|
||
}
|
||
adbPath = `"${adbPath}"`;
|
||
}
|
||
global.adbPath = adbPath;
|
||
if (global.opensslPath) {
|
||
cb();
|
||
}
|
||
});
|
||
childProcess.exec("openssl version", (error, stdout, stderr) => {
|
||
if (error) {
|
||
if (process.platform === "darwin") {
|
||
opensslPath = path.join(otherLibsPath, "openssl", "darwin", "bin", "openssl");
|
||
} else {
|
||
opensslPath = path.join(otherLibsPath, "openssl", "win", "bin", "openssl.exe");
|
||
let opensslCnfPath = path.join(otherLibsPath, "openssl", "win", "bin", "openssl.cfg");
|
||
// 特别的,当windows没有openssl时,需要额外的OPENSSL_CONF设置变量
|
||
// childProcess.execSync(`set OPENSSL_CONF=${opensslCnfPath}`);
|
||
process.env.OPENSSL_CONF = opensslCnfPath;
|
||
console.log("OPENSSL_CONF: " + childProcess.execSync("echo %OPENSSL_CONF%"));
|
||
}
|
||
opensslPath = `"${opensslPath}"`;
|
||
}
|
||
global.opensslPath = opensslPath;
|
||
if (global.adbPath) {
|
||
cb();
|
||
}
|
||
});
|
||
});
|
||
|
||
// 清理release文件夹
|
||
gulp.task("clearReleaseDir", ["compile"], function (cb) {
|
||
if (platform === "layame" && execTask !== "clearReleaseDir") { // 特殊的,layame项目不执行清理命令
|
||
return cb();
|
||
}
|
||
if (config.clearReleaseDir) {
|
||
let delList = [`${releaseDir}/**`, releaseDir + "_pack"];
|
||
if (config.packfileTargetValue) {
|
||
delList.push(config.packfileTargetValue);
|
||
}
|
||
// 小米快游戏,使用即存的项目,删掉Laya工程文件,保留小米环境项目文件
|
||
if (platform === "xmgame") {
|
||
let xmProj = path.join(releaseDir, config.xmInfo.projName);
|
||
// 这里不是node-glob语法,详见: https://github.com/sindresorhus/del
|
||
delList = [`${xmProj}/**`, `!${xmProj}`, `!${xmProj}/node_modules/**`, `!${xmProj}/sign/**`, `!${xmProj}/{babel.config.js,main.js,manifest.json,package.json,package-lock.json}`];
|
||
} else if (platform === "oppogame") {
|
||
let oppoProjSrc = path.join(releaseDir, config.oppoInfo.projName);
|
||
delList = [`${oppoProjSrc}/**`, `!${oppoProjSrc}`, `!${oppoProjSrc}/{manifest.json,main.js}`];
|
||
} else if (platform === "vivogame") {
|
||
let vvProj = path.join(releaseDir, config.vivoInfo.projName);
|
||
let vvProjSrc = path.join(vvProj, "src");
|
||
// 这里不是node-glob语法,详见: https://github.com/sindresorhus/del
|
||
delList = [`${vvProj}/engine/**`, `${vvProj}/laya-library/**`, `${vvProj}/config/**`,
|
||
`${vvProjSrc}/**`, `!${vvProjSrc}`, `!${vvProjSrc}/{game.js,manifest.json}`];
|
||
} else if (platform === "hwgame") {
|
||
let hwProjSrc = path.join(releaseDir, config.hwInfo.projName);
|
||
delList = [`${hwProjSrc}/**`, `!${hwProjSrc}`, `!${hwProjSrc}/{game.js,manifest.json}`];
|
||
}
|
||
// 保留平台配置文件
|
||
if (config.keepPlatformFile) {
|
||
if (["wxgame", "qqgame", "Alipaygame", "bytedancegame"].includes(platform)) {
|
||
delList = delList.concat(`!${releaseDir}`, `!${releaseDir}/{game.js,game.json,project.config.json}`);
|
||
} else if (platform === "bdgame") {
|
||
delList = delList.concat(`!${releaseDir}`, `!${releaseDir}/{game.js,game.json,project.swan.json}`);
|
||
} else if (platform === "biligame") {
|
||
delList = delList.concat(`!${releaseDir}`, `!${releaseDir}/{game.js,game.json}`);
|
||
} else if (platform === "taobaominiapp") { // 特殊的,淘宝平台,仅删除确定为我们的文件
|
||
// 删除 node_modules/layaengine/libs 下引擎文件,以及 node_modules/layaengine/laya.js 文件
|
||
// 删除 pages/index 下除 game.js,game.json,game.axml 外所有文件
|
||
// release/taobaominiapp/node_modules/layaengine/adapter.js 必更新
|
||
// 删除最外层除 .tea .mini-ide node_modules pages app.acss app.js app.json mini.project.json package.json
|
||
delList = [`${releaseDir}/node_modules/layaengine/libs`, `${releaseDir}/node_modules/layaengine/laya.js`,
|
||
`${releaseDir}/**`, `!${releaseDir}`, `!${releaseDir}/.tea/**`, `!${releaseDir}/.mini-ide/**·`,
|
||
`!${releaseDir}/node_modules/**`, `!${releaseDir}/pages/**`, `!${releaseDir}/{app.acss,app.js,app.json,mini.project.json,package.json}`,
|
||
// `${releaseDir}/node_modules/layaengine`, `!${releaseDir}/node_modules/layaengine`, `!${releaseDir}/node_modules/layaengine/{adapter.js,index.js/package.json}`,
|
||
`${releaseDir}/pages/index/**`, `!${releaseDir}/pages/index`, `!${releaseDir}/pages/index/{game.js,game.json,game.axml}`];
|
||
} else if (platform === "taobaowidget") {
|
||
delList = [`${releaseDir}/widget/component/**`, `!${releaseDir}/widget/component`, `!${releaseDir}/widget/component/{game.js,game.json,game.axml,game.acss,package.json}`];
|
||
}
|
||
}
|
||
del(delList, { force: true }).then(paths => {
|
||
cb();
|
||
}).catch((err) => {
|
||
throw err;
|
||
})
|
||
} else cb();
|
||
});
|
||
|
||
// copy bin文件到release文件夹
|
||
gulp.task("copyFile", ["clearReleaseDir"], function () {
|
||
let baseCopyFilter = [`${workSpaceDir}/bin/**/*.*`, `!${workSpaceDir}/bin/indexmodule.html`, `!${workSpaceDir}/bin/import/*.*`];
|
||
// 只拷贝index.js中引用的类库
|
||
if (config.onlyIndexJS) {
|
||
baseCopyFilter = baseCopyFilter.concat(`!${workSpaceDir}/bin/libs/**/*.*`);
|
||
}
|
||
if (platform === "wxgame" && isOpendataProj) { // 开放域项目微信发布,仅拷贝用到的文件
|
||
config.copyFilesFilter = [`${workSpaceDir}/bin/js/bundle.js`, `${workSpaceDir}/bin/index.js`, `${workSpaceDir}/bin/game.js`];
|
||
if (config.projectType !== "as") { // 开放域精简类库
|
||
config.copyFilesFilter.push(`${workSpaceDir}/bin/libs/laya.opendata.js`);
|
||
}
|
||
} else if (platform === "wxgame") { // 微信项目,不拷贝index.html,不拷贝百度bin目录中的文件
|
||
config.copyFilesFilter = baseCopyFilter.concat([`!${workSpaceDir}/bin/{project.swan.json,swan-game-adapter.js}`]);
|
||
} else if (platform === "bdgame") { // 百度项目,不拷贝index.html,不拷贝微信bin目录中的文件
|
||
config.copyFilesFilter = baseCopyFilter.concat([`!${workSpaceDir}/bin/{project.config.json,weapp-adapter.js}`]);
|
||
} else if (platform === "layame") { // layame项目,不拷贝js/libs文件夹,不拷贝index.js文件
|
||
config.copyFilesFilter = baseCopyFilter.concat([`!${workSpaceDir}/bin/{js/**/*.*,libs/**/*.*,index.js,version.json}`]);
|
||
|
||
} else { // 除微信、百度外,不拷贝微信、百度在bin目录中的文件
|
||
config.copyFilesFilter = baseCopyFilter.concat([`!${workSpaceDir}/bin/{game.js,game.json,project.config.json,weapp-adapter.js,project.swan.json,swan-game-adapter.js}`]);
|
||
}
|
||
// bili/alipay/qq,不拷贝index.html
|
||
if (platform !== "web") {
|
||
config.copyFilesFilter = config.copyFilesFilter.concat([`!${workSpaceDir}/bin/index.html`]);
|
||
}
|
||
// 快游戏,需要新建一个快游戏项目,拷贝的只是项目的一部分,将文件先拷贝到文件夹的临时目录中去
|
||
if ([...QUICKGAMELIST, "taobaominiapp", "taobaowidget"].includes(platform)) {
|
||
releaseDir = global.tempReleaseDir = path.join(releaseDir, "temprelease").replace(/\\/g, "/");
|
||
}
|
||
if (config.exclude) { // 排除文件
|
||
config.excludeFilter.forEach(function(item, index, list) {
|
||
releaseDir = releaseDir.replace(/\\/g, "/");
|
||
config.excludeFilter[index] = item.replace(releaseDir, binPath);
|
||
});
|
||
config.copyFilesFilter = config.copyFilesFilter.concat(config.excludeFilter);
|
||
}
|
||
global.releaseDir = releaseDir;
|
||
if (isDebugLayaMe) {
|
||
if (!toBuildPart('ui')) {
|
||
if(!fs.existsSync(releaseDir)) {
|
||
fs.mkdirSync(releaseDir);
|
||
}
|
||
return;
|
||
}
|
||
}
|
||
var stream = gulp.src(config.copyFilesFilter, { base: `${workSpaceDir}/bin` });
|
||
return stream.pipe(gulp.dest(releaseDir));
|
||
});
|
||
|
||
// 使用min版本引擎
|
||
gulp.task("useMinJsLibs", ["copyFile"], function () {
|
||
if (!config.useMinJsLibs) {
|
||
return;
|
||
}
|
||
if (platform === "wxgame" && isOpendataProj) { // 开放域项目微信发布,拷贝文件时已经拷贝类库文件了
|
||
return;
|
||
}
|
||
// 开放域项目,as语言,没有libs目录,mac系统报错
|
||
let libs = path.join(workSpaceDir, "bin", "libs");
|
||
if (!fs.existsSync(libs)) {
|
||
return;
|
||
}
|
||
if (platform === "layame") {
|
||
return;
|
||
}
|
||
// 分析index.js
|
||
let indexJSPath = path.join(releaseDir, "index.js");
|
||
let indexJsContent = fs.readFileSync(indexJSPath, "utf8");
|
||
let libsList = indexJsContent.match(/loadLib\(['"]libs\/[\w-./]+\.(js|wasm)['"]\)/g);
|
||
if (!libsList) {
|
||
return;
|
||
}
|
||
let
|
||
item,
|
||
libsName = "",
|
||
minLibsName = "";
|
||
for (let i = 0, len = libsList.length; i < len; i++) {
|
||
item = libsList[i];
|
||
libsName = item.match(/loadLib\(['"]libs\/([\w-./]+\.(js|wasm))['"]\)/);
|
||
minLibsName = `min/${libsName[1].replace(".js", ".min.js")}`;
|
||
indexJsContent = indexJsContent.replace(libsName[1], minLibsName);
|
||
}
|
||
fs.writeFileSync(indexJSPath, indexJsContent);
|
||
});
|
||
|
||
// copy libs中的js文件到release文件夹
|
||
gulp.task("copyLibsJsFile", ["useMinJsLibs"], function () {
|
||
if (platform === "layame") {
|
||
return;
|
||
}
|
||
// 分析index.js
|
||
let indexJSPath = path.join(releaseDir, "index.js");
|
||
let indexJsContent = fs.readFileSync(indexJSPath, "utf8");
|
||
indexJsContent = indexJsContent.replace(/(loadLib\(['"]libs\/[\w-./]+\.wasm\.wasm['"]\))/g, "// $1");
|
||
fs.writeFileSync(indexJSPath, indexJsContent, "utf8");
|
||
if (!config.onlyIndexJS) {
|
||
return;
|
||
}
|
||
if (platform === "wxgame" && isOpendataProj) { // 开放域项目微信发布,拷贝文件时已经拷贝类库文件了
|
||
return;
|
||
}
|
||
// 开放域项目,as语言,没有libs目录,mac系统报错
|
||
let libs = path.join(workSpaceDir, "bin", "libs");
|
||
if (!fs.existsSync(libs)) {
|
||
return;
|
||
}
|
||
let libsList = indexJsContent.match(/loadLib\(['"]libs\/[\w-./]+\.(js|wasm)['"]\)/g);
|
||
if (!libsList) {
|
||
libsList = [];
|
||
}
|
||
let
|
||
item,
|
||
libsName = "",
|
||
libsStr = "";
|
||
for (let i = 0, len = libsList.length; i < len; i++) {
|
||
item = libsList[i];
|
||
libsName = item.match(/loadLib\(['"]libs\/([\w-./]+\.(js|wasm))['"]\)/);
|
||
libsStr += libsStr ? `,${libsName[1]}` : libsName[1];
|
||
}
|
||
// 发布web项目,如果使用了physics3D,默认拷贝runtime
|
||
if (platform === "web" && libsStr.includes("laya.physics3D")) {
|
||
if (config.useMinJsLibs) {
|
||
libsStr += ',min/laya.physics3D.runtime.min.js';
|
||
} else {
|
||
libsStr += ',laya.physics3D.runtime.js';
|
||
}
|
||
}
|
||
let copyLibsList = [`${workSpaceDir}/bin/libs/{${libsStr}}`];
|
||
if (!libsStr.includes(",")) {
|
||
copyLibsList = [`${workSpaceDir}/bin/libs/${libsStr}`];
|
||
}
|
||
var stream = gulp.src(copyLibsList, { base: `${workSpaceDir}/bin` });
|
||
return stream.pipe(gulp.dest(releaseDir));
|
||
});
|
||
|
||
gulp.task("fitwasm", ["copyLibsJsFile"], function() {
|
||
let
|
||
phy3dWasmJs = path.join(releaseDir, "libs", "laya.physics3D.wasm.js"),
|
||
phy3dWasmMinJs = path.join(releaseDir, "libs", "min", "laya.physics3D.wasm.min.js");
|
||
let isPhy3dWasmJsExist = fs.existsSync(phy3dWasmJs);
|
||
let isPhy3dWasmMinJsExist = fs.existsSync(phy3dWasmMinJs);
|
||
if (!isPhy3dWasmJsExist && !isPhy3dWasmMinJsExist) {
|
||
return;
|
||
}
|
||
let phy3dWasmName = isPhy3dWasmJsExist ? phy3dWasmJs : phy3dWasmMinJs;
|
||
con = fs.readFileSync(phy3dWasmName, "utf8");
|
||
if (isPhy3dWasmJsExist) {
|
||
con = con.replace(/laya\.physics3D\.wasm\.wasm/mg, "libs/laya.physics3D.wasm.wasm");
|
||
}
|
||
if (isPhy3dWasmMinJsExist) {
|
||
con = con.replace(/laya\.physics3D\.wasm\.wasm/mg, "libs/min/laya.physics3D.wasm.wasm");
|
||
}
|
||
fs.writeFileSync(phy3dWasmName, con, "utf8");
|
||
})
|
||
|
||
gulp.task("copyPlatformLibsJsFile", ["fitwasm"], function () {
|
||
if (platform === "wxgame" && isOpendataProj) { // 开放域项目微信发布,拷贝文件时已经拷贝类库文件了
|
||
return;
|
||
}
|
||
// 开放域项目,as语言,没有libs目录,mac系统报错
|
||
let libs = path.join(workSpaceDir, "bin", "libs");
|
||
if (!fs.existsSync(libs)) {
|
||
return;
|
||
}
|
||
if (platform === "web") {
|
||
return;
|
||
}
|
||
if (platform === "layame") {
|
||
return;
|
||
}
|
||
let platformLibName = "";
|
||
switch (platform) {
|
||
case "wxgame":
|
||
platformLibName = "laya.wxmini.js";
|
||
break;
|
||
case "qqgame":
|
||
platformLibName = "laya.qqmini.js";
|
||
break;
|
||
case "bdgame":
|
||
platformLibName = "laya.bdmini.js";
|
||
break;
|
||
case "Alipaygame":
|
||
platformLibName = "laya.Alipaymini.js";
|
||
break;
|
||
case "biligame":
|
||
platformLibName = "laya.bilimini.js";
|
||
break;
|
||
case "bytedancegame":
|
||
platformLibName = "laya.ttmini.js";
|
||
break;
|
||
case "oppogame":
|
||
platformLibName = "laya.quickgamemini.js";
|
||
break;
|
||
case "vivogame":
|
||
platformLibName = "laya.vvmini.js";
|
||
break;
|
||
case "xmgame":
|
||
platformLibName = "laya.xmmini.js";
|
||
break;
|
||
case "hwgame":
|
||
platformLibName = "laya.hwmini.js";
|
||
break;
|
||
case "taobaominiapp":
|
||
platformLibName = "laya.tbmini.js";
|
||
break;
|
||
case "taobaowidget":
|
||
platformLibName = "laya.tbpluginmini.js";
|
||
break;
|
||
}
|
||
let copyPath = `${workSpaceDir}/bin/libs`;
|
||
if (config.useMinJsLibs) {
|
||
platformLibName = platformLibName.replace(".js", ".min.js");
|
||
copyPath = path.join(copyPath, "min");
|
||
}
|
||
let copyLibPath = path.join(copyPath, platformLibName);
|
||
var stream = gulp.src(copyLibPath, { base: `${workSpaceDir}/bin` });
|
||
return stream.pipe(gulp.dest(releaseDir));
|
||
});
|
||
|
||
// es6toes5
|
||
gulp.task("es6toes5", platformCopyTask, function() {
|
||
if (config.es6toes5) {
|
||
process.env.BROWSERSLIST_IGNORE_OLD_DATA = true;
|
||
return gulp.src(`${releaseDir}/**/*.js`, { base: releaseDir })
|
||
.pipe(babel({
|
||
presets: ['@babel/env'],
|
||
compact: false // 1) 为规避500K限制,不能为"auto" 2) 为便于调试,并防止开发者误解已经经过压缩,调整为false
|
||
}))
|
||
.on('error', function (err) {
|
||
console.warn(err.toString());
|
||
})
|
||
.pipe(gulp.dest(releaseDir));
|
||
}
|
||
})
|
||
|
||
// 压缩json
|
||
gulp.task("compressJson", ["es6toes5"], function () {
|
||
if (platform === "layame" && isDebugLayaMe) {
|
||
if (!toBuildPart('all')) {
|
||
return;
|
||
}
|
||
}
|
||
if (config.compressJson) {
|
||
return gulp.src(config.compressJsonFilter, { base: releaseDir })
|
||
.pipe(jsonminify())
|
||
.pipe(gulp.dest(releaseDir));
|
||
}
|
||
});
|
||
|
||
// 压缩js
|
||
gulp.task("compressJs", ["compressJson"], function () {
|
||
let compressJsFilter = null;
|
||
if (platform === "layame" && isDebugLayaMe) {
|
||
if (!toBuildPart('all')) {
|
||
return;
|
||
}
|
||
}
|
||
if (!config.compressJs) {
|
||
if (config.es6toes5 && config.useMinJsLibs) { // 如果开启了es6toes5并使用了压缩版类库
|
||
console.log("发布提示:\n 您当前开启了es6toes5并使用了压缩版类库,为了保证符合预期,脚本将对min文件夹下类库进行压缩");
|
||
compressJsFilter = [`${releaseDir}/libs/min/**/*.js`];
|
||
}
|
||
} else {
|
||
if (config.es6toes5 && config.useMinJsLibs) { // 如果开启了es6toes5并使用了压缩版类库
|
||
console.log("发布提示:\n 您当前开启了es6toes5并使用了压缩版类库,为了保证符合预期,脚本将对min文件夹下类库进行压缩");
|
||
compressJsFilter = config.compressJsFilter;
|
||
let index = compressJsFilter.indexOf(`!${releaseDir}/libs/min/**/*.js`)
|
||
if (index !== -1) {
|
||
compressJsFilter.splice(index, 1);
|
||
}
|
||
} else {
|
||
compressJsFilter = config.compressJsFilter;
|
||
}
|
||
}
|
||
if (!compressJsFilter) {
|
||
return;
|
||
}
|
||
|
||
let options = {
|
||
mangle: {
|
||
keep_fnames:true
|
||
}
|
||
}
|
||
if (["taobaominiapp", "taobaowidget"].includes(platform)) {
|
||
options = {
|
||
mangle: {
|
||
keep_fnames:true,
|
||
// sequences: false, // 不使用逗号
|
||
reserved: ["window"]
|
||
}
|
||
}
|
||
}
|
||
console.log("compressJsFilter: ", compressJsFilter);
|
||
return gulp.src(compressJsFilter, { base: releaseDir })
|
||
.pipe(uglify(options))
|
||
.on('error', function (err) {
|
||
console.warn(err.toString());
|
||
})
|
||
.pipe(gulp.dest(releaseDir));
|
||
});
|
||
|
||
// 压缩png,jpg
|
||
gulp.task("compressImage", ["compressJs"], function () {
|
||
// if (platform === "layame") {
|
||
// return;
|
||
// }
|
||
if (platform === "layame" && isDebugLayaMe) {
|
||
if (!toBuildPart('ui')) {
|
||
return;
|
||
}
|
||
}
|
||
if (config.compressImage) {
|
||
return gulp.src(config.compressImageFilter, { base: releaseDir })
|
||
.pipe(image({
|
||
pngquant: true, //PNG优化工具
|
||
optipng: false, //PNG优化工具
|
||
zopflipng: true, //PNG优化工具
|
||
jpegRecompress: false, //jpg优化工具
|
||
mozjpeg: true, //jpg优化工具
|
||
guetzli: false, //jpg优化工具
|
||
gifsicle: false, //gif优化工具
|
||
svgo: false, //SVG优化工具
|
||
concurrent: 10, //并发线程数
|
||
quiet: true //是否是静默方式
|
||
// optipng: ['-i 1', '-strip all', '-fix', '-o7', '-force'],
|
||
// pngquant: ['--speed=1', '--force', 256],
|
||
// zopflipng: ['-y', '--lossy_8bit', '--lossy_transparent'],
|
||
// jpegRecompress: ['--strip', '--quality', 'medium', '--min', 40, '--max', 80],
|
||
// mozjpeg: ['-optimize', '-progressive'],
|
||
// guetzli: ['--quality', 85]
|
||
}))
|
||
.pipe(gulp.dest(releaseDir));
|
||
}
|
||
});
|
||
|
||
// 生成版本管理信息
|
||
gulp.task("version1", ["compressImage"], function () {
|
||
if (platform === "layame") {
|
||
return;
|
||
}
|
||
if (config.version) {
|
||
return gulp.src(config.versionFilter, { base: releaseDir })
|
||
.pipe(rev())
|
||
.pipe(gulp.dest(releaseDir))
|
||
.pipe(revdel())
|
||
.pipe(rev.manifest("version.json"))
|
||
.pipe(gulp.dest(releaseDir));
|
||
}
|
||
});
|
||
|
||
// 更新index.js的hash值
|
||
gulp.task("renameIndexJs", ["version1"], function (cb) {
|
||
if (platform === "layame") {
|
||
return cb();
|
||
}
|
||
if (config.version) {
|
||
let versionPath = releaseDir + "/version.json";
|
||
let versionCon = fs.readFileSync(versionPath, "utf8");
|
||
versionCon = JSON.parse(versionCon);
|
||
let indexJSPath;
|
||
let indexJsStr = (versionCon && versionCon["index.js"]) ? versionCon["index.js"] : "index.js";
|
||
indexJSPath = releaseDir + "/" + indexJsStr;
|
||
|
||
return new Promise((resolve, reject) => {
|
||
let srcList = [versionPath, indexJSPath];
|
||
gulp.src(srcList)
|
||
.pipe(revCollector())
|
||
.pipe(gulp.dest(releaseDir));
|
||
setTimeout(resolve, 1500);
|
||
}).then(function() {
|
||
return new Promise(async function(resolve, reject) {
|
||
// index-xxx.js => index.js
|
||
let indexJsOrigin = path.join(releaseDir, "index.js")
|
||
fs.renameSync(indexJSPath, indexJsOrigin);
|
||
gulp.src(indexJsOrigin, { base: releaseDir })
|
||
.pipe(rev())
|
||
.pipe(gulp.dest(releaseDir))
|
||
.pipe(revdel())
|
||
.pipe(rev.manifest({
|
||
path: versionPath,
|
||
merge: true
|
||
}))
|
||
.pipe(gulp.dest("./")); // 注意,这里不能是releaseDir (https://segmentfault.com/q/1010000002876613)
|
||
setTimeout(cb, 2000);
|
||
})
|
||
}).catch(function(e) {
|
||
throw e;
|
||
})
|
||
} else {
|
||
cb();
|
||
}
|
||
});
|
||
// 修改版本文件名
|
||
gulp.task("renameVersionJson", ["renameIndexJs"] , function () {
|
||
|
||
if (platform === "layame") {
|
||
return;
|
||
}
|
||
if (config.version) {
|
||
// 如果启用版本管理,则修改version文件名
|
||
console.log('releaseDir', releaseDir);
|
||
let versionJsonJsOrigin = path.join(releaseDir, "version.json");
|
||
let versionPath = versionJsonJsOrigin;// releaseDir + "/version.json";
|
||
gulp.src(versionJsonJsOrigin, { base: releaseDir })
|
||
.pipe(rev())
|
||
.pipe(rev.manifest({
|
||
path: versionPath,
|
||
merge: true
|
||
}))
|
||
.pipe(gulp.dest("./"))
|
||
.on('end', function () {
|
||
|
||
let versionJsonJsOrigin = path.join(releaseDir, "version.json");
|
||
let versionConStr = fs.readFileSync(versionJsonJsOrigin, "utf8");
|
||
let versionCon = JSON.parse(versionConStr);
|
||
console.log('versionCon',versionCon );
|
||
let renameVersionJson = path.join(releaseDir, versionCon['version.json']);
|
||
// fs.renameSync(versionJsonJsOrigin, renameVersionJson);
|
||
// 最后再删除versionjson
|
||
fs.writeFileSync(renameVersionJson, versionConStr, 'utf8');
|
||
|
||
|
||
// 修改js/bundle.js里加载version.json路径
|
||
var bundleJSPath = path.join(releaseDir, versionCon['js/bundle.js']) ;
|
||
bundleJSStr = fs.readFileSync(bundleJSPath, "utf8");
|
||
bundleJSStr = bundleJSStr.replace('Laya.ResourceVersion.enable(\"version.json\"', `Laya.ResourceVersion.enable("${versionCon['version.json']}"`);
|
||
fs.writeFileSync(bundleJSPath, bundleJSStr, "utf8");
|
||
|
||
});
|
||
|
||
}
|
||
});
|
||
// 替换index.html/game.js/main.js以及index.js里面的变化的文件名
|
||
gulp.task("version2", ["renameVersionJson"], function () {
|
||
if (platform === "layame") {
|
||
return;
|
||
}
|
||
if (config.version) {
|
||
//替换index.html和index.js里面的文件名称
|
||
let htmlPath = releaseDir + "/index.html";
|
||
let versionPath = releaseDir + "/version.json";
|
||
let gameJSPath = releaseDir + "/game.js";
|
||
let mainJSPath = releaseDir + "/main.js";
|
||
let indexJSPath;
|
||
let versionCon = fs.readFileSync(versionPath, "utf8");
|
||
versionCon = JSON.parse(versionCon);
|
||
let indexJsStr = (versionCon && versionCon["index.js"]) ? versionCon["index.js"] : "index.js";
|
||
indexJSPath = releaseDir + "/" + indexJsStr;
|
||
// 替换config.packfileFullValue中的路径
|
||
let packfileStr = JSON.stringify(config.packfileFullValue).replace(/\\\\/g, "/");
|
||
let tempPackfile = `${workSpaceDir}/.laya/configTemp.json`;
|
||
fs.writeFileSync(tempPackfile, packfileStr, "utf8");
|
||
|
||
let srcList = [versionPath, indexJSPath, tempPackfile];
|
||
if (fs.existsSync(htmlPath)) {
|
||
srcList.push(htmlPath);
|
||
}
|
||
if (fs.existsSync(gameJSPath)) {
|
||
srcList.push(gameJSPath);
|
||
}
|
||
if (fs.existsSync(mainJSPath)) {
|
||
srcList.push(mainJSPath);
|
||
}
|
||
return gulp.src(srcList)
|
||
.pipe(revCollector())
|
||
.pipe(gulp.dest(releaseDir));
|
||
}
|
||
});
|
||
|
||
// 筛选4M包
|
||
gulp.task("packfile", platformTask, function() {
|
||
if (platform === "layame") {
|
||
return;
|
||
}
|
||
let taobaoFolders = "";
|
||
switch (platform) {
|
||
case "taobaominiapp":
|
||
taobaoFolders = "pages/index";
|
||
break;
|
||
case "taobaowidget":
|
||
taobaoFolders = "widget/component";
|
||
break;
|
||
default:
|
||
taobaoFolders = "quickgame";
|
||
}
|
||
if (config.version) {
|
||
releaseDir = releaseDir.replace("temprelease", taobaoFolders);
|
||
// 从release目录取得带有版本号的目录
|
||
let tempPackfile = `${workSpaceDir}/.laya/configTemp.json`;
|
||
let releasePackfile = `${releaseDir}/configTemp.json`;
|
||
let packfileStr = fs.readFileSync(releasePackfile, "utf8");
|
||
config.packfileFullValue = JSON.parse(packfileStr);
|
||
// 删掉临时目录
|
||
fs.unlinkSync(tempPackfile);
|
||
fs.unlinkSync(releasePackfile);
|
||
}
|
||
if (["taobaominiapp", "taobaowidget"].includes(platform)) {
|
||
releaseDir = releaseDir.replace("/temprelease", "").replace(`/${taobaoFolders}`, "");
|
||
for (let len = config.packfileFullValue.length, i = 0; i < len; i++) {
|
||
config.packfileFullValue[i] = config.packfileFullValue[i].replace("temprelease", "");
|
||
}
|
||
}
|
||
if (config.packfile) { // 提取本地包(文件列表形式)
|
||
return gulp.src(config.packfileFullValue, { base: releaseDir })
|
||
.pipe(gulp.dest(config.packfileTargetValue || releaseDir + "_pack"));
|
||
}
|
||
if (platform === "layame") {
|
||
return;
|
||
}
|
||
if (config.version) {
|
||
let versionJsonJsOrigin = path.join(releaseDir, "version.json");
|
||
fs.unlinkSync(versionJsonJsOrigin);
|
||
}
|
||
});
|
||
// 起始任务
|
||
gulp.task("publish", ["packfile"] , function () {
|
||
console.log("All tasks completed!");
|
||
}); |