_publish_bytedancegame_1742208354865.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  1. // v1.1.0
  2. const ideModuleDir = global.ideModuleDir;
  3. const workSpaceDir = global.workSpaceDir;
  4. //引用插件模块
  5. const gulp = require(ideModuleDir + "gulp");
  6. const fs = require("fs");
  7. const path = require("path");
  8. const del = require(ideModuleDir + "del");
  9. const revCollector = require(ideModuleDir + 'gulp-rev-collector');
  10. const { getEngineVersion, getFileMd5, canUsePluginEngine } = require("./pub_utils");
  11. const provider = "tt13aa65178c90228a";
  12. const minPluginVersion = "2.7.0";
  13. let fullRemoteEngineList = ["laya.core.js", "laya.filter.js", "laya.ani.js", "laya.tiledmap.js", "laya.d3.js", "laya.html.js", "laya.particle.js", "laya.ui.js", "laya.webgl.js", "laya.filter.js", "laya.d3Plugin.js"];
  14. let copyLibsTask = ["copyPlatformLibsJsFile"];
  15. let versiontask = ["version2"];
  16. let
  17. config,
  18. releaseDir;
  19. let versionCon; // 版本管理version.json
  20. let commandSuffix,
  21. layarepublicPath;
  22. gulp.task("preCreate_ByteDance", copyLibsTask, function() {
  23. releaseDir = global.releaseDir;
  24. config = global.config;
  25. commandSuffix = global.commandSuffix;
  26. layarepublicPath = global.layarepublicPath;
  27. if (config.useMinJsLibs) {
  28. fullRemoteEngineList = fullRemoteEngineList.map((item, index) => {
  29. return item.replace(".js", ".min.js");
  30. })
  31. }
  32. });
  33. gulp.task("copyPlatformFile_ByteDance", ["preCreate_ByteDance"], function() {
  34. let adapterPath = path.join(layarepublicPath, "LayaAirProjectPack", "lib", "data", "bytefiles");
  35. let hasPublishPlatform =
  36. fs.existsSync(path.join(releaseDir, "game.js")) &&
  37. fs.existsSync(path.join(releaseDir, "game.json")) &&
  38. fs.existsSync(path.join(releaseDir, "project.config.json"));
  39. let copyLibsList;
  40. if (hasPublishPlatform) {
  41. copyLibsList = [`${adapterPath}/microgame-adapter.js`];
  42. } else {
  43. copyLibsList = [`${adapterPath}/*.*`];
  44. }
  45. var stream = gulp.src(copyLibsList);
  46. return stream.pipe(gulp.dest(releaseDir));
  47. });
  48. gulp.task("modifyFile_ByteDance", versiontask, function() {
  49. // 修改game.json文件
  50. let gameJsonPath = path.join(releaseDir, "game.json");
  51. let content = fs.readFileSync(gameJsonPath, "utf8");
  52. let conJson = JSON.parse(content);
  53. conJson.deviceOrientation = config.bytedanceInfo.orientation;
  54. content = JSON.stringify(conJson, null, 4);
  55. fs.writeFileSync(gameJsonPath, content, "utf8");
  56. if (config.version || config.enableVersion) {
  57. let versionPath = releaseDir + "/version.json";
  58. versionCon = fs.readFileSync(versionPath, "utf8");
  59. versionCon = JSON.parse(versionCon);
  60. }
  61. // 修改index.js
  62. let indexJsStr = (versionCon && versionCon["index.js"]) ? versionCon["index.js"] : "index.js";
  63. let indexFilePath = path.join(releaseDir, indexJsStr);
  64. if (!fs.existsSync(indexFilePath)) {
  65. return;
  66. }
  67. let indexFileContent = fs.readFileSync(indexFilePath, "utf8");
  68. indexFileContent = indexFileContent.replace(/loadLib(\(['"])/gm, "require$1./");
  69. fs.writeFileSync(indexFilePath, indexFileContent, "utf8");
  70. })
  71. gulp.task("modifyMinJs_ByteDance", ["modifyFile_ByteDance"], function() {
  72. // 如果保留了平台文件,如果同时取消使用min类库,就会出现文件引用不正确的问题
  73. if (config.keepPlatformFile) {
  74. let fileJsPath = path.join(releaseDir, "game.js");
  75. let content = fs.readFileSync(fileJsPath, "utf-8");
  76. content = content.replace(/min\/laya(-[\w\d]+)?\.ttmini\.min\.js/gm, "laya.ttmini.js");
  77. fs.writeFileSync(fileJsPath, content, 'utf-8');
  78. }
  79. if (!config.useMinJsLibs) {
  80. return;
  81. }
  82. let fileJsPath = path.join(releaseDir, "game.js");
  83. let content = fs.readFileSync(fileJsPath, "utf-8");
  84. content = content.replace(/(min\/)?laya(-[\w\d]+)?\.ttmini(\.min)?\.js/gm, "min/laya.ttmini.min.js");
  85. fs.writeFileSync(fileJsPath, content, 'utf-8');
  86. });
  87. gulp.task("version_ByteDance", ["modifyMinJs_ByteDance"], function() {
  88. // 如果保留了平台文件,如果同时开启版本管理,就会出现文件引用不正确的问题
  89. if (config.keepPlatformFile) {
  90. let fileJsPath = path.join(releaseDir, "game.js");
  91. let content = fs.readFileSync(fileJsPath, "utf-8");
  92. content = content.replace(/laya(-[\w\d]+)?\.ttmini/gm, "laya.ttmini");
  93. content = content.replace(/index(-[\w\d]+)?\.js/gm, "index.js");
  94. fs.writeFileSync(fileJsPath, content, 'utf-8');
  95. }
  96. if (config.version) {
  97. let versionPath = releaseDir + "/version.json";
  98. let gameJSPath = releaseDir + "/game.js";
  99. let srcList = [versionPath, gameJSPath];
  100. return gulp.src(srcList)
  101. .pipe(revCollector())
  102. .pipe(gulp.dest(releaseDir));
  103. }
  104. });
  105. gulp.task("pluginEngin_ByteDance", ["version_ByteDance"], function(cb) {
  106. if (!config.uesEnginePlugin) { // 没有使用微信引擎插件,还是像以前一样发布
  107. return cb();
  108. }
  109. if (config.version) {
  110. let versionPath = releaseDir + "/version.json";
  111. versionCon = fs.readFileSync(versionPath, "utf8");
  112. versionCon = JSON.parse(versionCon);
  113. }
  114. let indexJsStr = (versionCon && versionCon["index.js"]) ? versionCon["index.js"] : "index.js";
  115. // 获取version等信息
  116. let coreLibPath = path.join(workSpaceDir, "bin", "libs", "laya.core.js");
  117. let isHasCoreLib = fs.existsSync(coreLibPath);
  118. let isOldAsProj = fs.existsSync(`${workSpaceDir}/asconfig.json`) && !isHasCoreLib;
  119. let isNewTsProj = fs.existsSync(`${workSpaceDir}/src/tsconfig.json`) && !isHasCoreLib;
  120. let EngineVersion = getEngineVersion();
  121. if (!EngineVersion) {
  122. throw new Error(`读取引擎版本号失败,请于服务提供商联系!`);
  123. }
  124. if (!EngineVersion || EngineVersion.includes("beta") || !canUsePluginEngine(EngineVersion, minPluginVersion)) {
  125. throw new Error(`该版本引擎无法使用引擎插件功能(engineVersion: ${EngineVersion})`);
  126. }
  127. console.log(`通过版本号检查: ${EngineVersion}`);
  128. // 使用引擎插件
  129. let localUseEngineList = [];
  130. let copyEnginePathList;
  131. new Promise(function(resolve, reject) {
  132. console.log(`修改game.js和game.json`);
  133. // 1) 修改game.js和game.json
  134. // 修改game.js
  135. let gameJsPath = path.join(releaseDir, "game.js");
  136. let platformJs = config.useMinJsLibs ? `require("./libs/min/laya.ttmini.min.js");` : `require("./libs/laya.ttmini.js");`;
  137. let gameJscontent = `require("microgame-adapter.js");\n${platformJs}\nrequirePlugin('layaPlugin');\nwindow.loadLib = require;\nrequire("./${indexJsStr}");`;
  138. fs.writeFileSync(gameJsPath, gameJscontent, "utf8");
  139. // 修改game.json,使其支持引擎插件
  140. let gameJsonPath = path.join(releaseDir, "game.json");
  141. let gameJsonContent = fs.readFileSync(gameJsonPath, "utf8");
  142. let conJson = JSON.parse(gameJsonContent);
  143. conJson.plugins = {
  144. "layaPlugin": {
  145. "version": EngineVersion,
  146. "provider": provider,
  147. "path": "laya-libs"
  148. }
  149. }
  150. gameJsonContent = JSON.stringify(conJson, null, 4);
  151. fs.writeFileSync(gameJsonPath, gameJsonContent, "utf8");
  152. resolve();
  153. }).then(function() {
  154. return new Promise(function(resolve, reject) {
  155. console.log(`确定用到的插件引擎`);
  156. // 2) 确定用到了那些插件引擎,并将插件引擎从index.js的引用中去掉
  157. let indexJsPath = path.join(releaseDir, indexJsStr);
  158. let indexJsCon = fs.readFileSync(indexJsPath, "utf8");
  159. let item, fullRequireItem;
  160. for (let i = 0, len = fullRemoteEngineList.length; i < len; i++) {
  161. item = fullRemoteEngineList[i];
  162. fullRequireItem = config.useMinJsLibs ? `require("./libs/min/${item}")` : `require("./libs/${item}")`;
  163. if (indexJsCon.includes(fullRequireItem)) {
  164. let _item = item.replace(".min.js", ".js"), _minItem = item;
  165. localUseEngineList.push(_item);
  166. indexJsCon = indexJsCon.replace(fullRequireItem + ";", "").replace(fullRequireItem + ",", "").replace(fullRequireItem, "");
  167. // 如果引用了压缩的类库,将其重命名为未压缩的类库,并拷贝到libs中
  168. if (config.useMinJsLibs) {
  169. let oldMinlibPath = path.join(releaseDir, "libs", "min", _minItem);
  170. let newMinlibPath = path.join(releaseDir, "libs", "min", _item);
  171. let newlibPath = path.join(releaseDir, "libs", _item);
  172. fs.renameSync(oldMinlibPath, newMinlibPath);
  173. // fs.copyFileSync(newlibPath, newMinlibPath);
  174. let con = fs.readFileSync(newMinlibPath, "utf8");
  175. fs.writeFileSync(newlibPath, con, "utf8");
  176. fs.unlinkSync(newMinlibPath);
  177. }
  178. }
  179. }
  180. if (isOldAsProj || isNewTsProj) { // 如果as||ts_new语言,开发者将laya.js也写入index.js中了,将其删掉
  181. fullRequireItem = `require("./laya.js")`;
  182. if (indexJsCon.includes(fullRequireItem)) {
  183. indexJsCon = indexJsCon.replace(fullRequireItem + ";", "").replace(fullRequireItem + ",", "").replace(fullRequireItem, "");
  184. }
  185. }
  186. fs.writeFileSync(indexJsPath, indexJsCon, "utf8");
  187. // ts/js再次修改game.js,仅引用使用到的类库
  188. // as||ts_new因为本地只有laya.js,无法仅引用使用到的类库
  189. if (!isOldAsProj && !isNewTsProj) {
  190. let pluginCon = "";
  191. localUseEngineList.forEach(function(item) {
  192. pluginCon += `requirePlugin("layaPlugin/${item}");\n`;
  193. });
  194. let gameJsPath = path.join(releaseDir, "game.js");
  195. let gameJsCon = fs.readFileSync(gameJsPath, "utf8");
  196. gameJsCon = gameJsCon.replace(`requirePlugin('layaPlugin');`, pluginCon);
  197. fs.writeFileSync(gameJsPath, gameJsCon, "utf8");
  198. }
  199. resolve();
  200. });
  201. }).then(function() {
  202. return new Promise(function(resolve, reject) {
  203. console.log(`将本地的引擎插件移动到laya-libs中`);
  204. // 3) 将本地的引擎插件移动到laya-libs中
  205. let libsPath = /** config.useMinJsLibs ? `${releaseDir}/libs/min` : */`${releaseDir}/libs`;
  206. copyEnginePathList = [`${libsPath}/{${localUseEngineList.join(",")}}`];
  207. if (isOldAsProj || isNewTsProj) { // 单独拷贝laya.js
  208. copyEnginePathList = [`${releaseDir}/laya.js`];
  209. }
  210. gulp.src(copyEnginePathList).pipe(gulp.dest(`${releaseDir}/laya-libs`));
  211. setTimeout(resolve, 500);
  212. });
  213. }).then(function() {
  214. return new Promise(function(resolve, reject) {
  215. console.log(`将libs中的本地引擎插件删掉`);
  216. // 4) 将libs中的本地引擎插件删掉
  217. del(copyEnginePathList, { force: true }).then(resolve);
  218. });
  219. }).then(function() {
  220. return new Promise(async function(resolve, reject) {
  221. console.log(`完善引擎插件目录`);
  222. // 5) 引擎插件目录laya-libs中还需要新建几个文件,使该目录能够使用
  223. if (isOldAsProj || isNewTsProj) { // 单独拷贝laya.js
  224. localUseEngineList.push("laya.js");
  225. }
  226. let
  227. layalibsPath = path.join(releaseDir, "laya-libs"),
  228. engineIndex = path.join(layalibsPath, "index.js"),
  229. engineplugin = path.join(layalibsPath, "plugin.json"),
  230. enginesignature = path.join(layalibsPath, "signature.json");
  231. // index.js
  232. if (!fs.existsSync(layalibsPath)) {
  233. throw new Error("引擎插件目录创建失败,请与服务提供商联系!");
  234. }
  235. let indexCon = "";
  236. localUseEngineList.forEach(function(item) {
  237. indexCon += `require("./${item}");\n`;
  238. });
  239. fs.writeFileSync(engineIndex, indexCon, "utf8");
  240. // plugin.json
  241. let pluginCon = {"main": "index.js"};
  242. fs.writeFileSync(engineplugin, JSON.stringify(pluginCon, null, 4), "utf8");
  243. // signature.json,目前平台方将其作为保留用途,不会做插件的md5校验;IDE仍将生成md5
  244. let signatureCon = {
  245. "provider": provider,
  246. "signature": []
  247. };
  248. localUseEngineList.unshift("index.js");
  249. let fileName, md5Str;
  250. for (let i = 0, len = localUseEngineList.length; i < len; i++) {
  251. fileName = localUseEngineList[i];
  252. let md5Str = await getFileMd5(path.join(releaseDir, "laya-libs", fileName));
  253. signatureCon.signature.push({
  254. "path": fileName,
  255. "md5": md5Str
  256. });
  257. }
  258. fs.writeFileSync(enginesignature, JSON.stringify(signatureCon, null, 4), "utf8");
  259. resolve();
  260. });
  261. })
  262. .then(function() {
  263. cb();
  264. }).catch(function(e) {
  265. throw e;
  266. })
  267. });
  268. gulp.task("buildByteDanceProj", ["pluginEngin_ByteDance"], function() {
  269. console.log("all tasks completed");
  270. });