publish_vivogame.js 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739
  1. // v1.3.0
  2. // publish 2.x 也是用这个文件,需要做兼容
  3. let isPublish2 = process.argv[2].includes("publish_vivogame.js") && process.argv[3].includes("--evn=publish2");
  4. // 获取Node插件和工作路径
  5. let ideModuleDir, workSpaceDir;
  6. if (isPublish2) {
  7. //是否使用IDE自带的node环境和插件,设置false后,则使用自己环境(使用命令行方式执行)
  8. const useIDENode = process.argv[0].indexOf("LayaAir") > -1 ? true : false;
  9. ideModuleDir = useIDENode ? process.argv[1].replace("gulp\\bin\\gulp.js", "").replace("gulp/bin/gulp.js", "") : "";
  10. workSpaceDir = useIDENode ? process.argv[2].replace("--gulpfile=", "").replace("\\.laya\\publish_vivogame.js", "").replace("/.laya/publish_vivogame.js", "") + "/" : "./../";
  11. } else {
  12. ideModuleDir = global.ideModuleDir;
  13. workSpaceDir = global.workSpaceDir;
  14. }
  15. //引用插件模块
  16. const gulp = require(ideModuleDir + "gulp");
  17. const fs = require("fs");
  18. const path = require("path");
  19. const childProcess = require("child_process");
  20. const del = require(ideModuleDir + "del");
  21. const iconv = require(ideModuleDir + "iconv-lite");
  22. const revCollector = require(ideModuleDir + 'gulp-rev-collector');
  23. let commandSuffix = ".cmd";
  24. let copyLibsTask = ["copyLibsJsFile"];
  25. let packfiletask = ["packfile"];
  26. if (isPublish2) {
  27. copyLibsTask = "";
  28. packfiletask = ["copyPlatformFile_VIVO"];
  29. }
  30. let
  31. config,
  32. platform,
  33. releaseDir,
  34. tempReleaseDir, // vivo临时拷贝目录
  35. projDir, // vivo快游戏工程目录
  36. isDealNoCompile = true,
  37. physicsLibsPathList = [],
  38. isExistEngineFolder = false; // bin目录下是否存在engine文件夹
  39. let projSrc;
  40. let versionCon; // 版本管理version.json
  41. // 创建vivo项目前,拷贝vivo引擎库、修改index.js
  42. // 应该在publish中的,但是为了方便发布2.0及IDE 1.x,放在这里修改
  43. gulp.task("preCreate_VIVO", copyLibsTask, function() {
  44. if (isPublish2) {
  45. let pubsetPath = path.join(workSpaceDir, ".laya", "pubset.json");
  46. let content = fs.readFileSync(pubsetPath, "utf8");
  47. let pubsetJson = JSON.parse(content);
  48. platform = "vivogame";
  49. releaseDir = path.join(workSpaceDir, "release", platform).replace(/\\/g, "/");
  50. releaseDir = tempReleaseDir = path.join(releaseDir, "temprelease");
  51. config = pubsetJson[6]; // 只用到了 config.vivoInfo|config.vivoSign
  52. } else {
  53. platform = global.platform;
  54. releaseDir = global.releaseDir;
  55. tempReleaseDir = global.tempReleaseDir;
  56. config = global.config;
  57. }
  58. // 如果不是vivo快游戏
  59. if (platform !== "vivogame") {
  60. return;
  61. }
  62. if (process.platform === "darwin") {
  63. commandSuffix = "";
  64. }
  65. let copyLibsList = [`${workSpaceDir}/bin/libs/laya.vvmini.js`];
  66. var stream = gulp.src(copyLibsList, { base: `${workSpaceDir}/bin` });
  67. return stream.pipe(gulp.dest(tempReleaseDir));
  68. });
  69. gulp.task("copyPlatformFile_VIVO", ["preCreate_VIVO"], function() {
  70. // 如果不是vivo快游戏
  71. if (platform !== "vivogame") {
  72. return;
  73. }
  74. let vivoAdapterPath = path.join(ideModuleDir, "../", "out", "layarepublic", "LayaAirProjectPack", "lib", "data", "vivofiles");
  75. let copyLibsList = [`${vivoAdapterPath}/**/*.*`];
  76. var stream = gulp.src(copyLibsList);
  77. return stream.pipe(gulp.dest(tempReleaseDir));
  78. });
  79. // 检查是否全局安装了qgame
  80. gulp.task("createGlobalQGame_VIVO", packfiletask, function() {
  81. // 如果不是vivo快游戏
  82. if (platform !== "vivogame") {
  83. return;
  84. }
  85. releaseDir = path.dirname(releaseDir);
  86. projDir = path.join(releaseDir, config.vivoInfo.projName);
  87. projSrc = path.join(projDir, "src");
  88. // npm view @vivo-minigame/cli version
  89. // npm install -g @vivo-minigame/cli
  90. let remoteVersion, localVersion;
  91. let isGetRemote, isGetLocal;
  92. let isUpdateGlobalQGame = true;
  93. return new Promise((resolve, reject) => { // 远程版本号
  94. childProcess.exec("npm view @vivo-minigame/cli version", function(error, stdout, stderr) {
  95. if (!stdout) { // 获取 @vivo-minigame/cli 远程版本号失败
  96. console.log("Failed to get the remote version number");
  97. resolve();
  98. return;
  99. }
  100. remoteVersion = stdout;
  101. isGetRemote = true;
  102. if (isGetRemote && isGetLocal) {
  103. isUpdateGlobalQGame = remoteVersion != localVersion;
  104. console.log(`remoteVersion: ${remoteVersion}, localVersion: ${localVersion}`);
  105. resolve();
  106. }
  107. });
  108. childProcess.exec("mg -v", { cwd: `${projDir}/node_modules` }, function(error, stdout, stderr) {
  109. if (!stdout) { // 获取 @vivo-minigame/cli 本地版本号失败
  110. console.log("Failed to get the local version number");
  111. resolve();
  112. return;
  113. }
  114. localVersion = stdout;
  115. isGetLocal = true;
  116. if (isGetRemote && isGetLocal) {
  117. isUpdateGlobalQGame = remoteVersion != localVersion;
  118. console.log(`remoteVersion: ${remoteVersion}, localVersion: ${localVersion}`);
  119. resolve();
  120. }
  121. });
  122. setTimeout(() => {
  123. if (!isGetLocal || !isGetRemote) {
  124. console.log("Failed to get the local or remote version number");
  125. resolve();
  126. return;
  127. }
  128. }, 10000);
  129. }).then(() => {
  130. return new Promise((resolve, reject) => {
  131. if (!isUpdateGlobalQGame) {
  132. resolve();
  133. return;
  134. }
  135. console.log("全局安装@vivo-minigame/cli");
  136. // npm install -g @vivo-minigame/cli
  137. let cmd = `npm${commandSuffix}`;
  138. let args = ["install", "@vivo-minigame/cli", "-g"];
  139. let opts = {
  140. shell: true
  141. };
  142. let cp = childProcess.spawn(cmd, args, opts);
  143. cp.stdout.on('data', (data) => {
  144. console.log(`stdout: ${data}`);
  145. });
  146. cp.stderr.on('data', (data) => {
  147. console.log(`stderr: ${data}`);
  148. // reject();
  149. });
  150. cp.on('close', (code) => {
  151. console.log(`2 end) npm install -g @vivo-minigame/cli:${code}`);
  152. resolve();
  153. });
  154. });
  155. }).catch((e) => {
  156. console.log("catch e", e);
  157. });
  158. });
  159. gulp.task("createProj_VIVO", ["createGlobalQGame_VIVO"], function() {
  160. // 如果不是vivo快游戏
  161. if (platform !== "vivogame") {
  162. return;
  163. }
  164. // 如果有即存项目,不再新建
  165. let isProjExist = fs.existsSync(projDir + "/node_modules") &&
  166. fs.existsSync(projDir + "/sign");
  167. if (isProjExist) {
  168. // 检测是否需要升级
  169. let packageCon = fs.readFileSync(`${projDir}/package.json`, "utf8");
  170. let minigamePath = path.join(projDir, "minigame.config.js");
  171. if (packageCon.includes("@vivo-minigame/cli-service") && fs.existsSync(minigamePath)) {
  172. return;
  173. }
  174. }
  175. // 如果有即存项目,但是是旧的项目,删掉后重新创建
  176. return new Promise((resolve, reject) => {
  177. if (!fs.existsSync(projDir)) {
  178. return resolve();
  179. }
  180. let delList = [projDir];
  181. del(delList, { force: true }).then(paths => {
  182. resolve();
  183. });
  184. }).then(function() {
  185. // 在项目中创建vivo项目
  186. return new Promise((resolve, reject) => {
  187. console.log("(proj)开始创建vivo快游戏项目");
  188. // mg init <project-name>
  189. let cmd = `mg${commandSuffix}`;
  190. let args = ["init", config.vivoInfo.projName];
  191. let opts = {
  192. cwd: releaseDir,
  193. shell: true
  194. };
  195. let cp = childProcess.spawn(cmd, args, opts);
  196. cp.stdout.on('data', (data) => {
  197. console.log(`stdout: ${data}`);
  198. });
  199. cp.stderr.on('data', (data) => {
  200. console.log(`stderr: ${data}`);
  201. // reject();
  202. });
  203. cp.on('close', (code) => {
  204. cp = null;
  205. console.log(`子进程退出码:${code}`);
  206. resolve();
  207. });
  208. });
  209. });
  210. });
  211. // 拷贝文件到vivo快游戏
  212. gulp.task("copyFileToProj_VIVO", ["createProj_VIVO"], function() {
  213. // 如果不是vivo快游戏
  214. if (platform !== "vivogame") {
  215. return;
  216. }
  217. // 如果有js/main.js,将其删除
  218. let vivoMainPath = path.join(projDir, "src", "js", "main.js");
  219. if (fs.existsSync(vivoMainPath)) {
  220. fs.unlinkSync(vivoMainPath);
  221. }
  222. // 将临时文件夹中的文件,拷贝到项目中去
  223. let originalDir = `${tempReleaseDir}/**/*.*`;
  224. let stream = gulp.src(originalDir);
  225. return stream.pipe(gulp.dest(path.join(projSrc)));
  226. });
  227. // 拷贝icon到vivo快游戏
  228. gulp.task("copyIconToProj_VIVO", ["copyFileToProj_VIVO"], function() {
  229. // 如果不是vivo快游戏
  230. if (platform !== "vivogame") {
  231. return;
  232. }
  233. let originalDir = config.vivoInfo.icon;
  234. let stream = gulp.src(originalDir);
  235. return stream.pipe(gulp.dest(projSrc));
  236. });
  237. // 清除vivo快游戏临时目录
  238. gulp.task("clearTempDir_VIVO", ["copyIconToProj_VIVO"], function() {
  239. // 如果不是vivo快游戏
  240. if (platform !== "vivogame") {
  241. return;
  242. }
  243. // 删掉临时目录
  244. return del([tempReleaseDir], { force: true });
  245. });
  246. // 生成release签名(私钥文件 private.pem 和证书文件 certificate.pem )
  247. gulp.task("generateSign_VIVO", ["clearTempDir_VIVO"], function() {
  248. // 如果不是vivo快游戏
  249. if (platform !== "vivogame") {
  250. return;
  251. }
  252. if (!config.vivoSign.generateSign) {
  253. return;
  254. }
  255. // https://doc.quickapp.cn/tools/compiling-tools.html
  256. return new Promise((resolve, reject) => {
  257. let cmd = "openssl";
  258. let args = ["req", "-newkey", "rsa:2048", "-nodes", "-keyout", "private.pem",
  259. "-x509", "-days", "3650", "-out", "certificate.pem"];
  260. let opts = {
  261. cwd: projDir,
  262. shell: true
  263. };
  264. let cp = childProcess.spawn(cmd, args, opts);
  265. cp.stdout.on('data', (data) => {
  266. console.log(`stdout: ${data}`);
  267. });
  268. cp.stderr.on('data', (data) => {
  269. console.log(`stderr: ${data}`);
  270. data += "";
  271. if (data.includes("Country Name")) {
  272. cp.stdin.write(`${config.vivoSign.countryName}\n`);
  273. console.log(`Country Name: ${config.vivoSign.countryName}`);
  274. } else if (data.includes("Province Name")) {
  275. cp.stdin.write(`${config.vivoSign.provinceName}\n`);
  276. console.log(`Province Name: ${config.vivoSign.provinceName}`);
  277. } else if (data.includes("Locality Name")) {
  278. cp.stdin.write(`${config.vivoSign.localityName}\n`);
  279. console.log(`Locality Name: ${config.vivoSign.localityName}`);
  280. } else if (data.includes("Organization Name")) {
  281. cp.stdin.write(`${config.vivoSign.orgName}\n`);
  282. console.log(`Organization Name: ${config.vivoSign.orgName}`);
  283. } else if (data.includes("Organizational Unit Name")) {
  284. cp.stdin.write(`${config.vivoSign.orgUnitName}\n`);
  285. console.log(`Organizational Unit Name: ${config.vivoSign.orgUnitName}`);
  286. } else if (data.includes("Common Name")) {
  287. cp.stdin.write(`${config.vivoSign.commonName}\n`);
  288. console.log(`Common Name: ${config.vivoSign.commonName}`);
  289. } else if (data.includes("Email Address")) {
  290. cp.stdin.write(`${config.vivoSign.emailAddr}\n`);
  291. console.log(`Email Address: ${config.vivoSign.emailAddr}`);
  292. // cp.stdin.end();
  293. }
  294. // reject();
  295. });
  296. cp.on('close', (code) => {
  297. console.log(`子进程退出码:${code}`);
  298. resolve();
  299. });
  300. });
  301. });
  302. // 拷贝sign文件到指定位置
  303. gulp.task("copySignFile_VIVO", ["generateSign_VIVO"], function() {
  304. // 如果不是vivo快游戏
  305. if (platform !== "vivogame") {
  306. return;
  307. }
  308. if (config.vivoSign.generateSign) { // 新生成的签名
  309. // 移动签名文件到项目中(Laya & vivo快游戏项目中)
  310. let
  311. privatePem = path.join(projDir, "private.pem"),
  312. certificatePem = path.join(projDir, "certificate.pem");
  313. let isSignExits = fs.existsSync(privatePem) && fs.existsSync(certificatePem);
  314. if (!isSignExits) {
  315. return;
  316. }
  317. let
  318. xiaomiDest = `${projDir}/sign/release`,
  319. layaDest = `${workSpaceDir}/sign/release`;
  320. let stream = gulp.src([privatePem, certificatePem]);
  321. return stream.pipe(gulp.dest(xiaomiDest))
  322. .pipe(gulp.dest(layaDest));
  323. } else if (config.vivoInfo.useReleaseSign && !config.vivoSign.generateSign) { // 使用release签名,并且没有重新生成
  324. // 从项目中将签名拷贝到vivo快游戏项目中
  325. let
  326. privatePem = path.join(workSpaceDir, "sign", "release", "private.pem"),
  327. certificatePem = path.join(workSpaceDir, "sign", "release", "certificate.pem");
  328. let isSignExits = fs.existsSync(privatePem) && fs.existsSync(certificatePem);
  329. if (!isSignExits) {
  330. return;
  331. }
  332. let
  333. xiaomiDest = `${projDir}/sign/release`;
  334. let stream = gulp.src([privatePem, certificatePem]);
  335. return stream.pipe(gulp.dest(xiaomiDest));
  336. }
  337. });
  338. gulp.task("deleteSignFile_VIVO", ["copySignFile_VIVO"], function() {
  339. // 如果不是vivo快游戏
  340. if (platform !== "vivogame") {
  341. return;
  342. }
  343. if (config.vivoSign.generateSign) { // 新生成的签名
  344. let
  345. privatePem = path.join(projDir, "private.pem"),
  346. certificatePem = path.join(projDir, "certificate.pem");
  347. return del([privatePem, certificatePem], { force: true });
  348. }
  349. });
  350. gulp.task("modifyFile_VIVO", ["deleteSignFile_VIVO"], function() {
  351. // 如果不是vivo快游戏
  352. if (platform !== "vivogame") {
  353. return;
  354. }
  355. // 修改manifest.json文件
  356. let manifestPath = path.join(projSrc, "manifest.json");
  357. if (!fs.existsSync(manifestPath)) {
  358. return;
  359. }
  360. let manifestContent = fs.readFileSync(manifestPath, "utf8");
  361. let manifestJson = JSON.parse(manifestContent);
  362. manifestJson.package = config.vivoInfo.package;
  363. manifestJson.name = config.vivoInfo.name;
  364. manifestJson.orientation = config.vivoInfo.orientation;
  365. manifestJson.config.logLevel = config.vivoInfo.logLevel || "off";
  366. manifestJson.deviceOrientation = config.vivoInfo.orientation;
  367. manifestJson.versionName = config.vivoInfo.versionName;
  368. manifestJson.versionCode = config.vivoInfo.versionCode;
  369. manifestJson.minPlatformVersion = config.vivoInfo.minPlatformVersion;
  370. manifestJson.icon = `/${path.basename(config.vivoInfo.icon)}`;
  371. if (config.vivoInfo.subpack) { // 分包
  372. manifestJson.subpackages = config.vivoSubpack;
  373. } else {
  374. delete manifestJson.subpackages;
  375. }
  376. // 增加thirdEngine字段
  377. let EngineVersion = getEngineVersion();
  378. if (EngineVersion) {
  379. manifestJson.thirdEngine = {
  380. "laya": EngineVersion
  381. };
  382. }
  383. fs.writeFileSync(manifestPath, JSON.stringify(manifestJson, null, 4), "utf8");
  384. if (config.version) {
  385. let versionPath = projSrc + "/version.json";
  386. versionCon = fs.readFileSync(versionPath, "utf8");
  387. versionCon = JSON.parse(versionCon);
  388. }
  389. let indexJsStr = (versionCon && versionCon["index.js"]) ? versionCon["index.js"] : "index.js";
  390. // 修改game.js文件
  391. let content = `require("./qgame-adapter.js");\nif(!window.navigator)\n\twindow.navigator = {};\nwindow.navigator.userAgent = 'Mozilla/5.0 (Linux; Android 5.1.1; Nexus 6 Build/LYZ28E) AppleWebKit/603.1.30 (KHTML, like Gecko) Mobile/14E8301 VVGame NetType/WIFI Language/zh_CN';
  392. require("./libs/laya.vvmini.js");\nrequire("./index.js");`;
  393. let gameJsPath = path.join(projSrc, "game.js");
  394. fs.writeFileSync(gameJsPath, content, "utf8");
  395. // vivo项目,修改index.js
  396. let filePath = path.join(projSrc, indexJsStr);
  397. if (!fs.existsSync(filePath)) {
  398. return;
  399. }
  400. let fileContent = fs.readFileSync(filePath, "utf8");
  401. fileContent = fileContent.replace(/loadLib(\(['"])/gm, "require$1./");
  402. fs.writeFileSync(filePath, fileContent, "utf8");
  403. })
  404. function getEngineVersion() {
  405. let coreLibPath = path.join(workSpaceDir, "bin", "libs", "laya.core.js");
  406. let isHasCoreLib = fs.existsSync(coreLibPath);
  407. let isOldAsProj = fs.existsSync(`${workSpaceDir}/asconfig.json`) && !isHasCoreLib;
  408. let isNewTsProj = fs.existsSync(`${workSpaceDir}/src/tsconfig.json`) && !isHasCoreLib;
  409. let EngineVersion;
  410. if (isHasCoreLib) {
  411. let con = fs.readFileSync(coreLibPath, "utf8");
  412. let matchList = con.match(/Laya\.version\s*=\s*['"]([0-9\.]+(beta)?.*)['"]/);
  413. if (!Array.isArray(matchList)) {
  414. return null;
  415. }
  416. EngineVersion = matchList[1];
  417. } else { // newts项目和旧版本as项目
  418. if (isOldAsProj) {
  419. let coreLibFilePath = path.join(workSpaceDir, "libs", "laya", "src", "Laya.as");
  420. if (!fs.existsSync(coreLibFilePath)) {
  421. return null;
  422. }
  423. let con = fs.readFileSync(coreLibFilePath, "utf8");
  424. let matchList = con.match(/version:String\s*=\s*['"]([0-9\.]+(beta)?.*)['"]/);
  425. if (!Array.isArray(matchList)) {
  426. return null;
  427. }
  428. EngineVersion = matchList[1];
  429. } else if (isNewTsProj) {
  430. let coreLibFilePath = path.join(workSpaceDir, "libs", "Laya.ts");
  431. if (!fs.existsSync(coreLibFilePath)) {
  432. return null;
  433. }
  434. let con = fs.readFileSync(coreLibFilePath, "utf8");
  435. let matchList = con.match(/static\s*version:\s*string\s*=\s*['"]([0-9\.]+(beta)?.*)['"]/);
  436. if (!Array.isArray(matchList)) {
  437. return null;
  438. }
  439. EngineVersion = matchList[1];
  440. }
  441. }
  442. return EngineVersion;
  443. }
  444. gulp.task("version_VIVO", ["modifyFile_VIVO"], function () {
  445. // 如果不是vivo快游戏
  446. if (platform !== "vivogame") {
  447. return;
  448. }
  449. if (config.version) {
  450. let versionPath = projSrc + "/version.json";
  451. let mainJSPath = projSrc + "/game.js";
  452. let srcList = [versionPath, mainJSPath];
  453. return gulp.src(srcList)
  454. .pipe(revCollector())
  455. .pipe(gulp.dest(projSrc));
  456. }
  457. });
  458. // 处理engine文件夹
  459. gulp.task("dealEngineFolder1_VIVO", ["version_VIVO"], function() {
  460. // 如果项目中有engine文件夹,我们默认该开发者是熟悉VIVO发布流程的,已经处理好所有的逻辑
  461. // 值得注意的:
  462. // 1) 如果有engine文件夹而未处理2D物理库(box2d.js/physics.js),项目将无法运行
  463. // 2) 如果未处理3D物理库(physics3D.js),打包时间将会很长
  464. // 如果不是vivo快游戏
  465. if (platform !== "vivogame") {
  466. return;
  467. }
  468. let engineFolder = path.join(projDir, "src", "engine");
  469. isExistEngineFolder = fs.existsSync(engineFolder);
  470. if (!isExistEngineFolder) {
  471. return;
  472. }
  473. let adapterOriginalPath = path.join(projDir, "src", "qgame-adapter.js");
  474. // 不想写一堆task任务,500ms默认拷贝完成吧
  475. // 未来有了更好的解决方案再修改
  476. return new Promise(function(resolve, reject) {
  477. // 将engine文件夹拷贝到projRoot下
  478. setTimeout(resolve, 500);
  479. var stream = gulp.src([`${engineFolder}/**/*.*`], {base: `${projDir}/src`});
  480. return stream.pipe(gulp.dest(projDir));
  481. }).then(function() {
  482. return new Promise(function(resolve, reject) {
  483. // 将adapter.js拷贝到engine文件夹中
  484. setTimeout(resolve, 500);
  485. var stream = gulp.src([adapterOriginalPath]);
  486. return stream.pipe(gulp.dest(`${projDir}/engine`));
  487. });
  488. }).then(function() {
  489. return new Promise(function(resolve, reject) {
  490. // 删掉src下的engine和adapter
  491. setTimeout(resolve, 500);
  492. return del([engineFolder, adapterOriginalPath], { force: true });
  493. });
  494. }).catch(function(err) {
  495. console.log(err);
  496. });
  497. });
  498. gulp.task("dealEngineFolder2_VIVO", ["dealEngineFolder1_VIVO"], function() {
  499. // 如果不是vivo快游戏
  500. if (platform !== "vivogame") {
  501. return;
  502. }
  503. if (!isExistEngineFolder) {
  504. return;
  505. }
  506. let engineFolder = path.join(projDir, "engine");
  507. let engineFileList = fs.readdirSync(engineFolder);
  508. // 修改配置文件
  509. configVivoConfigFile(engineFileList);
  510. });
  511. // 如果项目中用到了 box2d.js|laya.physics.js/laya.physics3D.js ,需要特殊处理
  512. // 之前处理的是有项目中已经存在engine文件夹的情况,现在开始处理没有文件夹的情况
  513. gulp.task("dealNoCompile1_VIVO", ["dealEngineFolder2_VIVO"], function() {
  514. // 如果不是vivo快游戏
  515. if (platform !== "vivogame") {
  516. return;
  517. }
  518. if (!isDealNoCompile) {
  519. return;
  520. }
  521. // let indexJsStr = (versionCon && versionCon["index.js"]) ? versionCon["index.js"] : "index.js";
  522. // let bundleJsStr = (versionCon && versionCon["js/bundle.js"]) ? versionCon["js/bundle.js"] : "js/bundle.js";
  523. // let box2dJsStr = (versionCon && versionCon["libs/box2d.js"]) ? versionCon["libs/box2d.js"] : "libs/box2d.js";
  524. // let physicsJsStr = (versionCon && versionCon["libs/laya.physics.js"]) ? versionCon["libs/laya.physics.js"] : "libs/laya.physics.js";
  525. // let physics3DJsStr = (versionCon && versionCon["libs/laya.physics3D.js"]) ? versionCon["libs/laya.physics3D.js"] : "libs/laya.physics3D.js";
  526. // // 修改index.js,去掉物理库前面的libs
  527. // let filePath = path.join(projSrc, indexJsStr);
  528. // let fileContent = fs.readFileSync(filePath, "utf8");
  529. // let physicsNameList = [];
  530. // if (fileContent.includes(bundleJsStr)) {
  531. // let adapterJsPath = path.join(projSrc, bundleJsStr);
  532. // physicsNameList.push(bundleJsStr);
  533. // physicsLibsPathList.push(adapterJsPath);
  534. // }
  535. // if (fileContent.includes(box2dJsStr)) {
  536. // let libPath = path.join(projSrc, box2dJsStr);
  537. // physicsNameList.push(box2dJsStr);
  538. // physicsLibsPathList.push(libPath);
  539. // }
  540. // if (fileContent.includes(physicsJsStr)) {
  541. // let libPath = path.join(projSrc, physicsJsStr);
  542. // physicsNameList.push(physicsJsStr);
  543. // physicsLibsPathList.push(libPath);
  544. // }
  545. // if (fileContent.includes(physics3DJsStr)) {
  546. // let libPath = path.join(projSrc, physics3DJsStr);
  547. // physicsNameList.push(physics3DJsStr);
  548. // physicsLibsPathList.push(libPath);
  549. // }
  550. // if (physicsLibsPathList.length > 0) {
  551. // let adapterJsPath = path.join(projSrc, "qgame-adapter.js");
  552. // physicsNameList.push("qgame-adapter.js");
  553. // physicsLibsPathList.push(adapterJsPath);
  554. // }
  555. // 将js/bundle.js | libs/*.* qgame-adapter.js 全放到engine文件夹中
  556. let indexJsStr = (versionCon && versionCon["index.js"]) ? versionCon["index.js"] : "index.js";
  557. let bundleJsStr = (versionCon && versionCon["js/bundle.js"]) ? versionCon["js/bundle.js"] : "js/bundle.js";
  558. // 修改index.js,去掉物理库前面的libs
  559. let filePath = path.join(projSrc, indexJsStr);
  560. let fileContent = fs.readFileSync(filePath, "utf8");
  561. let physicsNameList = [];
  562. if (fileContent.includes(bundleJsStr)) {
  563. let adapterJsPath = path.join(projSrc, bundleJsStr);
  564. physicsNameList.push(bundleJsStr);
  565. physicsLibsPathList.push(adapterJsPath);
  566. }
  567. let libsList = fs.readdirSync(path.join(projSrc, "libs"));
  568. let libsFileName, libsFilePath;
  569. for (let i = 0, len = libsList.length; i < len; i++) {
  570. libsFileName = libsList[i];
  571. libsFilePath = path.join(projSrc, "libs", libsFileName);
  572. physicsNameList.push(`libs/${libsFileName}`);
  573. physicsLibsPathList.push(libsFilePath);
  574. }
  575. if (physicsLibsPathList.length > 0) {
  576. let adapterJsPath = path.join(projSrc, "qgame-adapter.js");
  577. physicsNameList.push("qgame-adapter.js");
  578. physicsLibsPathList.push(adapterJsPath);
  579. }
  580. // 修改配置文件
  581. configVivoConfigFile(physicsNameList);
  582. // 将物理库、qgame-adapter.js拷贝到engine中
  583. var stream = gulp.src(physicsLibsPathList, {base: projSrc});
  584. return stream.pipe(gulp.dest(path.join(projDir, "engine")));
  585. });
  586. function configVivoConfigFile(engineFileList) {
  587. let vvConfigPath = path.join(projDir, "minigame.config.js");
  588. let content = fs.readFileSync(vvConfigPath, "utf8");
  589. let externalsStr = 'const externals = [\n';
  590. let libName;
  591. for (let i = 0, len = engineFileList.length; i < len; i++) {
  592. libName = engineFileList[i];
  593. if (i !== 0) {
  594. externalsStr += ',\n';
  595. }
  596. // 不要改这里的缩进,否则最终的结果不好看
  597. externalsStr += `{
  598. module_name:'./${libName}',
  599. module_path:'./${libName}',
  600. module_from:'engine/${libName}'
  601. }`;
  602. }
  603. externalsStr += '\t]';
  604. content = content.replace(/const externals = \[([^*].|\n|\r)*\]/gm, externalsStr);
  605. fs.writeFileSync(vvConfigPath, content, "utf8");
  606. }
  607. gulp.task("dealNoCompile2_VIVO", ["dealNoCompile1_VIVO"], function() {
  608. // 如果不是vivo快游戏
  609. if (platform !== "vivogame") {
  610. return;
  611. }
  612. if (!isDealNoCompile || physicsLibsPathList.length === 0) {
  613. return;
  614. }
  615. return del(physicsLibsPathList, { force: true });
  616. });
  617. // 打包rpk
  618. gulp.task("buildRPK_VIVO", ["dealNoCompile2_VIVO"], function() {
  619. // 如果不是vivo快游戏
  620. if (platform !== "vivogame") {
  621. return;
  622. }
  623. // 在vivo轻游戏项目目录中执行:
  624. // npm run build || npm run release
  625. let cmdStr = "build";
  626. if (config.vivoInfo.useReleaseSign) {
  627. cmdStr = "release";
  628. }
  629. return new Promise((resolve, reject) => {
  630. let cmd = `npm${commandSuffix}`;
  631. let args = ["run", cmdStr];
  632. let opts = {
  633. cwd: projDir,
  634. shell: true
  635. };
  636. let cp = childProcess.spawn(cmd, args, opts);
  637. // let cp = childProcess.spawn(`npx${commandSuffix}`, ['-v']);
  638. cp.stdout.on('data', (data) => {
  639. console.log(`stdout: ${data}`);
  640. });
  641. cp.stderr.on('data', (data) => {
  642. console.log(`stderr: ${data}`);
  643. console.log(`stderr(iconv): ${iconv.decode(data, 'gbk')}`);
  644. // reject();
  645. });
  646. cp.on('close', (code) => {
  647. console.log(`子进程退出码:${code}`);
  648. resolve();
  649. });
  650. });
  651. });
  652. gulp.task("showQRCode_VIVO", ["buildRPK_VIVO"], function() {
  653. // 如果不是vivo快游戏
  654. if (platform !== "vivogame") {
  655. return;
  656. }
  657. // 在vivo轻游戏项目目录中执行:
  658. // npm run server
  659. return new Promise((resolve, reject) => {
  660. let cmd = `npm${commandSuffix}`;
  661. let args = ["run", "server"];
  662. let opts = {
  663. cwd: projDir,
  664. shell: true
  665. };
  666. let cp = childProcess.spawn(cmd, args, opts);
  667. // let cp = childProcess.spawn(`npx${commandSuffix}`, ['-v']);
  668. cp.stdout.on('data', (data) => {
  669. console.log(`${data}`);
  670. // 输出pid,macos要用: macos无法kill进程树,也无法执行命令获取3000端口pid(没有查询权限),导致无法kill这个进程
  671. console.log('vv_qrcode_pid:' + cp.pid);
  672. });
  673. cp.stderr.on('data', (data) => {
  674. console.log(`stderr: ${data}`);
  675. console.log(`stderr(iconv): ${iconv.decode(data, 'gbk')}`);
  676. // reject();
  677. });
  678. cp.on('close', (code) => {
  679. console.log(`子进程退出码:${code}`);
  680. resolve();
  681. });
  682. });
  683. });
  684. gulp.task("buildVivoProj", ["showQRCode_VIVO"], function() {
  685. console.log("all tasks completed");
  686. });