// 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!"); });