_publish_1587114640115.js 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474
  1. <<<<<<< HEAD
  2. // v1.4.0
  3. =======
  4. // v1.5.0
  5. >>>>>>> 0a4f9cee68a53cedb69ed7be7ad0f642f7d32003
  6. //是否使用IDE自带的node环境和插件,设置false后,则使用自己环境(使用命令行方式执行)
  7. const useIDENode = process.argv[0].indexOf("LayaAir") > -1 ? true : false;
  8. //获取Node插件和工作路径
  9. let ideModuleDir = useIDENode ? process.argv[1].replace("gulp\\bin\\gulp.js", "").replace("gulp/bin/gulp.js", "") : "";
  10. let workSpaceDir = useIDENode ? process.argv[2].replace("--gulpfile=", "").replace("\\.laya\\publish.js", "").replace("/.laya/publish.js", "") + "/" : "./../";
  11. //引用插件模块
  12. const gulp = require(ideModuleDir + "gulp");
  13. const fs = require("fs");
  14. const path = require("path");
  15. const uglify = require(ideModuleDir + 'gulp-uglify-es').default;
  16. const jsonminify = require(ideModuleDir + "gulp-jsonminify");
  17. const image = require(ideModuleDir + "gulp-image");
  18. const rev = require(ideModuleDir + "gulp-rev");
  19. const revdel = require(ideModuleDir + "gulp-rev-delete-original");
  20. const revCollector = require(ideModuleDir + 'gulp-rev-collector');
  21. const del = require(ideModuleDir + "del");
  22. const requireDir = require(ideModuleDir + 'require-dir');
  23. global.ideModuleDir = ideModuleDir;
  24. global.workSpaceDir = workSpaceDir;
  25. // 结合compile.js使用
  26. global.publish = true;
  27. <<<<<<< HEAD
  28. const fileList = ["compile.js", "publish_xmgame.js", "publish_oppogame.js", "publish_vivogame.js"];
  29. =======
  30. const fileList = ["compile.js", "publish_xmgame.js", "publish_oppogame.js", "publish_vivogame.js", "publish_wxgame.js", "publish_bdgame.js", "publish_qqgame.js"];
  31. >>>>>>> 0a4f9cee68a53cedb69ed7be7ad0f642f7d32003
  32. requireDir('./', {
  33. filter: function (fullPath) {
  34. // 只用到了compile.js和publish.js
  35. if (fileList.includes(path.basename(fullPath))) {
  36. return true;
  37. } else {
  38. return false;
  39. }
  40. }
  41. });
  42. const QUICKGAMELIST = ["xmgame", "oppogame", "vivogame"];
  43. // 清理临时文件夹,加载配置
  44. let config,
  45. releaseDir,
  46. binPath,
  47. platform,
  48. isOpendataProj = false;
  49. gulp.task("loadConfig", function () {
  50. platform = "web"
  51. if (!useIDENode && process.argv.length > 5 && process.argv[4] == "--config") {
  52. platform = process.argv[5].replace(".json", "");
  53. }
  54. if (useIDENode && process.argv.length >= 4 && process.argv[3].startsWith("--config") && process.argv[3].endsWith(".json")) {
  55. platform = process.argv[3].match(/(\w+).json/)[1];
  56. }
  57. let _path;
  58. if (!useIDENode) {
  59. _path = platform + ".json";
  60. releaseDir = "../release/" + platform;
  61. binPath = "../bin/";
  62. }
  63. if (useIDENode) {
  64. _path = path.join(workSpaceDir, ".laya", `${platform}.json`);
  65. releaseDir = path.join(workSpaceDir, "release", platform).replace(/\\/g, "/");
  66. binPath = path.join(workSpaceDir, "bin").replace(/\\/g, "/");
  67. }
  68. global.platform = platform;
  69. let file = fs.readFileSync(_path, "utf-8");
  70. if (file) {
  71. if (QUICKGAMELIST.includes(platform)) {
  72. file = file.replace(/\$basePath/g, releaseDir + "/temprelease");
  73. } else {
  74. file = file.replace(/\$basePath/g, releaseDir);
  75. }
  76. config = JSON.parse(file);
  77. global.config = config;
  78. }
  79. // 是否是开放域项目
  80. let projInfoPath = path.join(workSpaceDir, path.basename(workSpaceDir) + ".laya");
  81. let isExist = fs.existsSync(projInfoPath);
  82. if (isExist) {
  83. try {
  84. let projInfo = fs.readFileSync(projInfoPath, "utf8");
  85. projInfo = projInfo && JSON.parse(projInfo);
  86. isOpendataProj = projInfo.layaProType === 12;
  87. } catch (e) {}
  88. }
  89. });
  90. <<<<<<< HEAD
  91. // 重新编译项目
  92. // gulp.task("compile", ["loadConfig"], function () {
  93. // if (config.compile) {
  94. // console.log("compile");
  95. // }
  96. // });
  97. =======
  98. >>>>>>> 0a4f9cee68a53cedb69ed7be7ad0f642f7d32003
  99. // 清理release文件夹
  100. gulp.task("clearReleaseDir", ["compile"], function (cb) {
  101. if (config.clearReleaseDir) {
  102. let delList = [releaseDir, releaseDir + "_pack", config.packfileTargetValue];
  103. // 小米快游戏,使用即存的项目,删掉Laya工程文件,保留小米环境项目文件
  104. if (platform === "xmgame") {
  105. let xmProjSrc = path.join(releaseDir, config.xmInfo.projName);
  106. // 不要删掉manifest.json/main.js文件
  107. // 这里不是node-glob语法,详见: https://github.com/sindresorhus/del
  108. delList = [`${xmProjSrc}/**`, `!${xmProjSrc}`, `!${xmProjSrc}/node_modules/**`, `!${xmProjSrc}/sign/**`, `!${xmProjSrc}/{babel.config.js,main.js,manifest.json,package.json,package-lock.json}`];
  109. } else if (platform === "oppogame") {
  110. let oppoProjSrc = path.join(releaseDir, config.oppoInfo.projName);
  111. delList = [`${oppoProjSrc}/**`, `!${oppoProjSrc}`, `!${oppoProjSrc}/dist/**`, `!${oppoProjSrc}/{manifest.json}`];
  112. } else if (platform === "vivogame") {
  113. let vvProj = path.join(releaseDir, config.vivoInfo.projName);
  114. let vvProjSrc = path.join(vvProj, "src");
  115. // 不要删掉manifest.json/main.js文件
  116. // 这里不是node-glob语法,详见: https://github.com/sindresorhus/del
  117. delList = [`${vvProjSrc}/**`, `!${vvProjSrc}`, `!${vvProjSrc}/sign/**`, `!${vvProjSrc}/{game.js,manifest.json}`];
  118. delList = delList.concat(`${vvProj}/engine/**`, `${vvProj}/config/**`);
  119. }
  120. del(delList, { force: true }).then(paths => {
  121. cb();
  122. });
  123. } else cb();
  124. });
  125. // copy bin文件到release文件夹
  126. gulp.task("copyFile", ["clearReleaseDir"], function () {
  127. let baseCopyFilter = [`${workSpaceDir}/bin/**/*.*`, `!${workSpaceDir}/bin/indexmodule.html`, `!${workSpaceDir}/bin/import/*.*`];
  128. // 只拷贝index.js中引用的类库
  129. if (config.onlyIndexJS) {
  130. baseCopyFilter = baseCopyFilter.concat(`!${workSpaceDir}/bin/libs/*.*`);
  131. }
  132. if (platform === "wxgame" && isOpendataProj) { // 开放域项目微信发布,仅拷贝用到的文件
  133. config.copyFilesFilter = [`${workSpaceDir}/bin/js/bundle.js`, `${workSpaceDir}/bin/index.js`, `${workSpaceDir}/bin/game.js`];
  134. if (config.projectType !== "as") { // 开放域精简类库
  135. <<<<<<< HEAD
  136. config.copyFilesFilter.push(`${workSpaceDir}/bin/libs/laya.opendata.min.js`);
  137. =======
  138. config.copyFilesFilter.push(`${workSpaceDir}/bin/libs/laya.opendata.js`);
  139. >>>>>>> 0a4f9cee68a53cedb69ed7be7ad0f642f7d32003
  140. }
  141. } else if (platform === "wxgame") { // 微信项目,不拷贝index.html,不拷贝百度bin目录中的文件
  142. config.copyFilesFilter = baseCopyFilter.concat([`!${workSpaceDir}/bin/index.html`, `!${workSpaceDir}/bin/{project.swan.json,swan-game-adapter.js}`]);
  143. } else if (platform === "bdgame") { // 百度项目,不拷贝index.html,不拷贝微信bin目录中的文件
  144. config.copyFilesFilter = baseCopyFilter.concat([`!${workSpaceDir}/bin/index.html`, `!${workSpaceDir}/bin/{project.config.json,weapp-adapter.js}`]);
  145. } else { // web|QQ项目|bili|快游戏,不拷贝微信、百度在bin目录中的文件
  146. config.copyFilesFilter = baseCopyFilter.concat([`!${workSpaceDir}/bin/{game.js,game.json,project.config.json,weapp-adapter.js,project.swan.json,swan-game-adapter.js}`]);
  147. }
  148. // bili/alipay/qq,不拷贝index.html
  149. if (["biligame", "Alipaygame", "qqgame"].includes(platform)) {
  150. config.copyFilesFilter = config.copyFilesFilter.concat([`!${workSpaceDir}/bin/index.html`]);
  151. }
  152. // 快游戏,需要新建一个快游戏项目,拷贝的只是项目的一部分,将文件先拷贝到文件夹的临时目录中去
  153. if (QUICKGAMELIST.includes(platform)) {
  154. config.copyFilesFilter = config.copyFilesFilter.concat([`!${workSpaceDir}/bin/index.html`]);
  155. releaseDir = global.tempReleaseDir = path.join(releaseDir, "temprelease");
  156. }
  157. if (config.exclude) { // 排除文件
  158. config.excludeFilter.forEach(function(item, index, list) {
  159. releaseDir = releaseDir.replace(/\\/g, "/");
  160. config.excludeFilter[index] = item.replace(releaseDir, binPath);
  161. });
  162. config.copyFilesFilter = config.copyFilesFilter.concat(config.excludeFilter);
  163. }
  164. global.releaseDir = releaseDir;
  165. var stream = gulp.src(config.copyFilesFilter, { base: `${workSpaceDir}/bin` });
  166. return stream.pipe(gulp.dest(releaseDir));
  167. });
  168. // copy libs中的js文件到release文件夹
  169. gulp.task("copyLibsJsFile", ["copyFile"], function () {
  170. if (!config.onlyIndexJS) {
  171. return;
  172. }
  173. if (platform === "wxgame" && isOpendataProj) { // 开放域项目微信发布,拷贝文件时已经拷贝类库文件了
  174. return;
  175. }
  176. // 开放域项目,as语言,没有libs目录,mac系统报错
  177. let libs = path.join(workSpaceDir, "bin", "libs");
  178. if (!fs.existsSync(libs)) {
  179. return;
  180. }
  181. // 分析index.js
  182. let indexJSPath = path.join(workSpaceDir, "bin", "index.js");
  183. let indexJsContent = fs.readFileSync(indexJSPath, "utf8");
  184. let libsList = indexJsContent.match(/loadLib\(['"]libs\/[\w-./]+\.(js|wasm)['"]\)/g);
  185. if (!libsList) {
  186. libsList = [];
  187. }
  188. let
  189. item,
  190. libsName = "",
  191. libsStr = "";
  192. for (let i = 0, len = libsList.length; i < len; i++) {
  193. item = libsList[i];
  194. libsName = item.match(/loadLib\(['"]libs\/([\w-./]+\.(js|wasm))['"]\)/);
  195. libsStr += libsStr ? `,${libsName[1]}` : libsName[1];
  196. }
  197. <<<<<<< HEAD
  198. =======
  199. // 发布web项目,如果使用了physics3D,默认拷贝runtime
  200. if (platform === "web" && libsStr.includes("laya.physics3D")) {
  201. libsStr += ',laya.physics3D.runtime.js';
  202. }
  203. >>>>>>> 0a4f9cee68a53cedb69ed7be7ad0f642f7d32003
  204. let copyLibsList = [`${workSpaceDir}/bin/libs/{${libsStr}}`];
  205. if (!libsStr.includes(",")) {
  206. copyLibsList = [`${workSpaceDir}/bin/libs/${libsStr}`];
  207. }
  208. <<<<<<< HEAD
  209. // 微信、百度,需要拷贝对应平台的类库
  210. if (platform === "wxgame") {
  211. copyLibsList.push(`${workSpaceDir}/bin/libs/laya.wxmini.js`);
  212. } else if (platform === "bdgame") {
  213. copyLibsList.push(`${workSpaceDir}/bin/libs/laya.bdmini.js`);
  214. } else if (platform === "qqgame") {
  215. copyLibsList.push(`${workSpaceDir}/bin/libs/laya.qqmini.js`);
  216. }
  217. =======
  218. >>>>>>> 0a4f9cee68a53cedb69ed7be7ad0f642f7d32003
  219. var stream = gulp.src(copyLibsList, { base: `${workSpaceDir}/bin` });
  220. return stream.pipe(gulp.dest(releaseDir));
  221. });
  222. <<<<<<< HEAD
  223. // 根据不同的项目类型拷贝平台文件
  224. gulp.task("copyPlatformFile", ["copyLibsJsFile"], function () {
  225. let fileLibsPath;
  226. if (useIDENode) {
  227. fileLibsPath = path.join(ideModuleDir, "../", "out", "layarepublic", "LayaAirProjectPack", "lib", "data");
  228. } else if (process.argv.length >= 8 && process.argv[6] === "--libspath") {
  229. fileLibsPath = process.argv[7];
  230. console.log("平台文件包是否存在: " + fs.existsSync(fileLibsPath));
  231. } else {
  232. console.log("没有接收到可用文件包位置,不拷贝对应平台文件");
  233. return;
  234. }
  235. // 开放域项目,微信发布
  236. if (platform === "wxgame" && isOpendataProj) {
  237. let platformDir = path.join(fileLibsPath, "wxfiles", "weapp-adapter.js");
  238. let stream = gulp.src(platformDir);
  239. return stream.pipe(gulp.dest(releaseDir));
  240. }
  241. // 微信项目,非开放域项目
  242. if (platform === "wxgame") {
  243. // 如果新建项目时已经点击了"微信/百度小游戏bin目录快速调试",不再拷贝
  244. let isHadWXFiles =
  245. fs.existsSync(path.join(workSpaceDir, "bin", "game.js")) &&
  246. fs.existsSync(path.join(workSpaceDir, "bin", "game.json")) &&
  247. fs.existsSync(path.join(workSpaceDir, "bin", "project.config.json")) &&
  248. fs.existsSync(path.join(workSpaceDir, "bin", "weapp-adapter.js"));
  249. if (isHadWXFiles) {
  250. return;
  251. }
  252. let platformDir = path.join(fileLibsPath, "wxfiles");
  253. let stream = gulp.src(platformDir + "/*.*");
  254. return stream.pipe(gulp.dest(releaseDir));
  255. }
  256. // 百度项目
  257. if (platform === "bdgame") {
  258. // 如果新建项目时已经点击了"微信/百度小游戏bin目录快速调试",不再拷贝
  259. let isHadBdFiles =
  260. fs.existsSync(path.join(workSpaceDir, "bin", "game.js")) &&
  261. fs.existsSync(path.join(workSpaceDir, "bin", "game.json")) &&
  262. fs.existsSync(path.join(workSpaceDir, "bin", "project.swan.json")) &&
  263. fs.existsSync(path.join(workSpaceDir, "bin", "swan-game-adapter.js"));
  264. if (isHadBdFiles) {
  265. return;
  266. }
  267. let platformDir = path.join(fileLibsPath, "bdfiles");
  268. let stream = gulp.src(platformDir + "/*.*");
  269. return stream.pipe(gulp.dest(releaseDir));
  270. }
  271. // QQ小游戏
  272. if (platform === "qqgame") {
  273. let platformDir = path.join(fileLibsPath, "qqfiles");
  274. let stream = gulp.src(platformDir + "/*.*");
  275. return stream.pipe(gulp.dest(releaseDir));
  276. }
  277. });
  278. // 拷贝文件后,针对特定平台修改文件内容
  279. gulp.task("modifyFile", ["copyPlatformFile"], function () {
  280. // QQ小游戏
  281. // if (platform === "qqgame") {
  282. // return;
  283. // }
  284. // 百度项目,修改index.js
  285. if (platform === "bdgame") {
  286. let filePath = path.join(releaseDir, "index.js");
  287. if (!fs.existsSync(filePath)) {
  288. return;
  289. }
  290. let fileContent = fs.readFileSync(filePath, "utf8");
  291. fileContent = fileContent.replace(/loadLib\(/g, "require(");
  292. fs.writeFileSync(filePath, fileContent, "utf8");
  293. return;
  294. }
  295. });
  296. // 压缩json
  297. gulp.task("compressJson", ["modifyFile"], function () {
  298. =======
  299. // 压缩json
  300. gulp.task("compressJson", ["copyLibsJsFile"], function () {
  301. >>>>>>> 0a4f9cee68a53cedb69ed7be7ad0f642f7d32003
  302. if (config.compressJson) {
  303. return gulp.src(config.compressJsonFilter, { base: releaseDir })
  304. .pipe(jsonminify())
  305. .pipe(gulp.dest(releaseDir));
  306. }
  307. });
  308. // 压缩js
  309. gulp.task("compressJs", ["compressJson"], function () {
  310. if (config.compressJs) {
  311. return gulp.src(config.compressJsFilter, { base: releaseDir })
  312. .pipe(uglify({
  313. <<<<<<< HEAD
  314. mangle: false
  315. =======
  316. mangle: {
  317. keep_fnames:true
  318. }
  319. >>>>>>> 0a4f9cee68a53cedb69ed7be7ad0f642f7d32003
  320. }))
  321. .on('error', function (err) {
  322. console.warn(err.toString());
  323. })
  324. .pipe(gulp.dest(releaseDir));
  325. }
  326. });
  327. // 压缩png,jpg
  328. gulp.task("compressImage", ["compressJs"], function () {
  329. if (config.compressImage) {
  330. return gulp.src(config.compressImageFilter, { base: releaseDir })
  331. .pipe(image({
  332. pngquant: true, //PNG优化工具
  333. optipng: false, //PNG优化工具
  334. zopflipng: true, //PNG优化工具
  335. jpegRecompress: false, //jpg优化工具
  336. mozjpeg: true, //jpg优化工具
  337. guetzli: false, //jpg优化工具
  338. gifsicle: false, //gif优化工具
  339. svgo: false, //SVG优化工具
  340. concurrent: 10, //并发线程数
  341. quiet: true //是否是静默方式
  342. // optipng: ['-i 1', '-strip all', '-fix', '-o7', '-force'],
  343. // pngquant: ['--speed=1', '--force', 256],
  344. // zopflipng: ['-y', '--lossy_8bit', '--lossy_transparent'],
  345. // jpegRecompress: ['--strip', '--quality', 'medium', '--min', 40, '--max', 80],
  346. // mozjpeg: ['-optimize', '-progressive'],
  347. // guetzli: ['--quality', 85]
  348. }))
  349. .pipe(gulp.dest(releaseDir));
  350. }
  351. });
  352. <<<<<<< HEAD
  353. // 开放域的情况下,合并game.js和index.js,并删除game.js
  354. gulp.task("openData", ["compressImage"], function (cb) {
  355. if (config.openDataZone) {
  356. let indexPath = releaseDir + "/index.js";
  357. let indexjs = readFile(indexPath);
  358. let gamejs = readFile(releaseDir + "/game.js");
  359. if (gamejs && indexjs) {
  360. gamejs = gamejs.replace('require("index.js")', indexjs);
  361. fs.writeFileSync(indexPath, gamejs, 'utf-8');
  362. }
  363. if (isOpendataProj) {
  364. // 开放域项目,将game.js删掉,发布最小包
  365. del(`${releaseDir}/game.js`, { force: true }).then(paths => {
  366. cb();
  367. });
  368. } else {
  369. cb();
  370. }
  371. } else {
  372. cb();
  373. }
  374. });
  375. function readFile(path) {
  376. if (fs.existsSync(path)) {
  377. return fs.readFileSync(path, "utf-8");
  378. }
  379. return null;
  380. }
  381. // 生成版本管理信息
  382. gulp.task("version1", ["openData"], function () {
  383. =======
  384. // 生成版本管理信息
  385. gulp.task("version1", ["compressImage"], function () {
  386. >>>>>>> 0a4f9cee68a53cedb69ed7be7ad0f642f7d32003
  387. if (config.version) {
  388. return gulp.src(config.versionFilter, { base: releaseDir })
  389. .pipe(rev())
  390. .pipe(gulp.dest(releaseDir))
  391. .pipe(revdel())
  392. .pipe(rev.manifest("version.json"))
  393. .pipe(gulp.dest(releaseDir));
  394. }
  395. });
  396. // 替换index.js里面的变化的文件名
  397. gulp.task("version2", ["version1"], function () {
  398. if (config.version) {
  399. //替换index.html和index.js里面的文件名称
  400. let htmlPath = releaseDir + "/index.html";
  401. let versionPath = releaseDir + "/version.json";
  402. let gameJSPath = releaseDir + "/game.js";
  403. let mainJSPath = releaseDir + "/main.js";
  404. let indexJSPath;
  405. let versionCon = fs.readFileSync(versionPath, "utf8");
  406. versionCon = JSON.parse(versionCon);
  407. indexJSPath = releaseDir + "/" + versionCon["index.js"];
  408. // 替换config.packfileFullValue中的路径
  409. let packfileStr = JSON.stringify(config.packfileFullValue).replace(/\\\\/g, "/");
  410. let tempPackfile = `${workSpaceDir}/.laya/configTemp.json`;
  411. fs.writeFileSync(tempPackfile, packfileStr, "utf8");
  412. let srcList = [versionPath, indexJSPath, tempPackfile];
  413. if (fs.existsSync(htmlPath)) {
  414. srcList.push(htmlPath);
  415. }
  416. if (fs.existsSync(gameJSPath)) {
  417. srcList.push(gameJSPath);
  418. }
  419. if (fs.existsSync(mainJSPath)) {
  420. srcList.push(mainJSPath);
  421. }
  422. return gulp.src(srcList)
  423. .pipe(revCollector())
  424. .pipe(gulp.dest(releaseDir));
  425. }
  426. });
  427. // 筛选4M包
  428. gulp.task("packfile", ["version2"], function() {
  429. if (config.version) {
  430. // 从release目录取得带有版本号的目录
  431. let tempPackfile = `${workSpaceDir}/.laya/configTemp.json`;
  432. let releasePackfile = `${releaseDir}/configTemp.json`;
  433. let packfileStr = fs.readFileSync(releasePackfile, "utf8");
  434. config.packfileFullValue = JSON.parse(packfileStr);
  435. // 删掉临时目录
  436. fs.unlinkSync(tempPackfile);
  437. fs.unlinkSync(releasePackfile);
  438. }
  439. if (config.packfile) { // 提取本地包(文件列表形式)
  440. return gulp.src(config.packfileFullValue, { base: releaseDir })
  441. .pipe(gulp.dest(config.packfileTargetValue || releaseDir + "_pack"));
  442. }
  443. });
  444. // 起始任务
  445. <<<<<<< HEAD
  446. gulp.task("publish", ["buildXiaomiProj", "buildOPPOProj", "buildVivoProj"], function () {
  447. =======
  448. gulp.task("publish", ["buildXiaomiProj", "buildOPPOProj", "buildVivoProj", "buildWXProj", "buildBDProj", "buildQQProj"], function () {
  449. >>>>>>> 0a4f9cee68a53cedb69ed7be7ad0f642f7d32003
  450. console.log("All tasks completed!");
  451. });