_publish_vivogame_1587349798384.js 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699
  1. // v1.0.1
  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 isGlobalQG = true;
  25. let prevTasks = ["packfile"];
  26. if (isPublish2) {
  27. prevTasks = "";
  28. }
  29. let
  30. config,
  31. platform,
  32. releaseDir,
  33. tempReleaseDir, // vivo临时拷贝目录
  34. projDir, // vivo快游戏工程目录
  35. isDealNoCompile,
  36. physicsLibsPathList = [],
  37. isExistEngineFolder = false; // bin目录下是否存在engine文件夹
  38. let projSrc;
  39. let versionCon; // 版本管理version.json
  40. // 创建vivo项目前,拷贝vivo引擎库、修改index.js
  41. // 应该在publish中的,但是为了方便发布2.0及IDE 1.x,放在这里修改
  42. gulp.task("preCreate_VIVO", prevTasks, function() {
  43. if (isPublish2) {
  44. let pubsetPath = path.join(workSpaceDir, ".laya", "pubset.json");
  45. let content = fs.readFileSync(pubsetPath, "utf8");
  46. let pubsetJson = JSON.parse(content);
  47. platform = "vivogame";
  48. releaseDir = path.join(workSpaceDir, "release", platform).replace(/\\/g, "/");
  49. releaseDir = tempReleaseDir = path.join(releaseDir, "temprelease");
  50. config = pubsetJson[6]; // 只用到了 config.vivoInfo|config.vivoSign
  51. } else {
  52. platform = global.platform;
  53. releaseDir = global.releaseDir;
  54. tempReleaseDir = global.tempReleaseDir;
  55. config = global.config;
  56. }
  57. // 如果不是vivo快游戏
  58. if (platform !== "vivogame") {
  59. return;
  60. }
  61. if (process.platform === "darwin") {
  62. commandSuffix = "";
  63. }
  64. let copyLibsList = [`${workSpaceDir}/bin/libs/laya.vvmini.js`];
  65. var stream = gulp.src(copyLibsList, { base: `${workSpaceDir}/bin` });
  66. return stream.pipe(gulp.dest(tempReleaseDir));
  67. });
  68. gulp.task("copyPlatformFile_VIVO", ["preCreate_VIVO"], function() {
  69. // 如果不是vivo快游戏
  70. if (platform !== "vivogame") {
  71. return;
  72. }
  73. let vivoAdapterPath = path.join(ideModuleDir, "../", "out", "layarepublic", "LayaAirProjectPack", "lib", "data", "vivofiles");
  74. let copyLibsList = [`${vivoAdapterPath}/**/*.*`];
  75. var stream = gulp.src(copyLibsList);
  76. return stream.pipe(gulp.dest(tempReleaseDir));
  77. });
  78. // 检查是否全局安装了qgame
  79. gulp.task("createGlobalQGame_VIVO", ["copyPlatformFile_VIVO"], function() {
  80. // 如果不是vivo快游戏
  81. if (platform !== "vivogame") {
  82. return;
  83. }
  84. // qgame -V
  85. // npm install -g qgame-toolkit
  86. return new Promise((resolve, reject) => {
  87. let cmd = `qgame${commandSuffix}`;
  88. let args = ["-V"];
  89. let cp = childProcess.spawn(cmd, args, {
  90. shell: true
  91. });
  92. // let cp = childProcess.spawn('npx.cmd', ['-v']);
  93. cp.stdout.on('data', (data) => {
  94. console.log(`stdout: ${data}`);
  95. if (data.includes("qgame")) {
  96. isGlobalQG = false;
  97. }
  98. });
  99. cp.stderr.on('data', (data) => {
  100. console.log(`stderr: ${data}`);
  101. console.log(`stderr(iconv): ${iconv.decode(data, 'gbk')}`);
  102. if (data.includes("qgame") && !data.includes("qgame-toolkit")) {
  103. isGlobalQG = false;
  104. }
  105. // reject();
  106. });
  107. cp.on('close', (code) => {
  108. console.log(`1 end) qgame -V:${code}`);
  109. resolve();
  110. });
  111. }).then(() => {
  112. return new Promise((resolve, reject) => {
  113. if (isGlobalQG) {
  114. resolve();
  115. return;
  116. }
  117. console.log("全局安装qgame-toolkit");
  118. // npm install -g qgame-toolkit
  119. let cmd = `npm${commandSuffix}`;
  120. let args = ["install", "qgame-toolkit", "-g"];
  121. let cp = childProcess.spawn(cmd, args);
  122. cp.stdout.on('data', (data) => {
  123. console.log(`stdout: ${data}`);
  124. });
  125. cp.stderr.on('data', (data) => {
  126. console.log(`stderr: ${data}`);
  127. // reject();
  128. });
  129. cp.on('close', (code) => {
  130. console.log(`2 end) npm install -g qgame-toolkit:${code}`);
  131. resolve();
  132. });
  133. });
  134. }).catch((e) => {
  135. console.log("catch e", e);
  136. });
  137. });
  138. gulp.task("createProj_VIVO", ["createGlobalQGame_VIVO"], function() {
  139. // 如果不是vivo快游戏
  140. if (platform !== "vivogame") {
  141. return;
  142. }
  143. releaseDir = path.dirname(releaseDir);
  144. projDir = path.join(releaseDir, config.vivoInfo.projName);
  145. projSrc = path.join(projDir, "src");
  146. // 如果有即存项目,不再新建
  147. let isProjExist = fs.existsSync(projDir + "/node_modules") &&
  148. fs.existsSync(projDir + "/sign");
  149. if (isProjExist) {
  150. return;
  151. }
  152. // 在项目中创建vivo项目
  153. return new Promise((resolve, reject) => {
  154. console.log("(proj)开始创建vivo快游戏项目");
  155. let cmd = `qgame${commandSuffix}`;
  156. let args = ["init", config.vivoInfo.projName];
  157. let opts = {
  158. cwd: releaseDir
  159. };
  160. let cp = childProcess.spawn(cmd, args, opts);
  161. cp.stdout.on('data', (data) => {
  162. console.log(`stdout: ${data}`);
  163. if (data.includes("Init your Project")) {
  164. cp.stdin.write(`\n`);
  165. }
  166. // TODO 这里还是要找原因,不要这样
  167. if (data.includes("manifest.json created")) {
  168. setTimeout(function() {
  169. cp && cp.kill();
  170. }, 500);
  171. }
  172. });
  173. cp.stderr.on('data', (data) => {
  174. console.log(`stderr: ${data}`);
  175. // reject();
  176. });
  177. cp.on('close', (code) => {
  178. cp = null;
  179. console.log(`子进程退出码:${code}`);
  180. resolve();
  181. });
  182. });
  183. });
  184. gulp.task("installProj_VIVO", ["createProj_VIVO"], function() {
  185. // 如果不是vivo快游戏
  186. if (platform !== "vivogame") {
  187. return;
  188. }
  189. // 如果有即存项目,不再新建
  190. let isProjExist = fs.existsSync(projDir + "/node_modules") &&
  191. fs.existsSync(projDir + "/sign");
  192. if (isProjExist) {
  193. return;
  194. }
  195. return new Promise((resolve, reject) => {
  196. console.log("(proj)下载类库 -> (npm install )");
  197. let cmd = `npm${commandSuffix}`;
  198. let args = ["install"];
  199. let opts = {
  200. cwd: projDir
  201. };
  202. let cp = childProcess.spawn(cmd, args, opts);
  203. cp.stdout.on('data', (data) => {
  204. console.log(`stdout: ${data}`);
  205. });
  206. cp.stderr.on('data', (data) => {
  207. console.log(`stderr: ${data}`);
  208. // reject();
  209. });
  210. cp.on('close', (code) => {
  211. console.log(`子进程退出码:${code}`);
  212. resolve();
  213. });
  214. });
  215. });
  216. // 拷贝文件到vivo快游戏
  217. gulp.task("copyFileToProj_VIVO", ["installProj_VIVO"], function() {
  218. // 如果不是vivo快游戏
  219. if (platform !== "vivogame") {
  220. return;
  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.deviceOrientation = config.vivoInfo.orientation;
  366. manifestJson.versionName = config.vivoInfo.versionName;
  367. manifestJson.versionCode = config.vivoInfo.versionCode;
  368. manifestJson.minPlatformVersion = config.vivoInfo.minPlatformVersion;
  369. manifestJson.icon = `/${path.basename(config.vivoInfo.icon)}`;
  370. fs.writeFileSync(manifestPath, JSON.stringify(manifestJson, null, 4), "utf8");
  371. if (config.version) {
  372. let versionPath = projSrc + "/version.json";
  373. versionCon = fs.readFileSync(versionPath, "utf8");
  374. versionCon = JSON.parse(versionCon);
  375. }
  376. let indexJsStr = (versionCon && versionCon["index.js"]) ? versionCon["index.js"] : "index.js";
  377. // 修改game.js文件
  378. 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';\nrequire("./libs/laya.vvmini.js");\nrequire("./index.js");`;
  379. let gameJsPath = path.join(projSrc, "game.js");
  380. fs.writeFileSync(gameJsPath, content, "utf8");
  381. // vivo项目,修改index.js
  382. let filePath = path.join(projSrc, indexJsStr);
  383. if (!fs.existsSync(filePath)) {
  384. return;
  385. }
  386. let fileContent = fs.readFileSync(filePath, "utf8");
  387. fileContent = fileContent.replace(/loadLib(\(['"])/gm, "require$1./");
  388. fs.writeFileSync(filePath, fileContent, "utf8");
  389. })
  390. gulp.task("version_VIVO", ["modifyFile_VIVO"], function () {
  391. // 如果不是vivo快游戏
  392. if (platform !== "vivogame") {
  393. return;
  394. }
  395. if (config.version) {
  396. let versionPath = projSrc + "/version.json";
  397. let mainJSPath = projSrc + "/game.js";
  398. let srcList = [versionPath, mainJSPath];
  399. return gulp.src(srcList)
  400. .pipe(revCollector())
  401. .pipe(gulp.dest(projSrc));
  402. }
  403. });
  404. // 处理engine文件夹
  405. gulp.task("dealEngineFolder1_VIVO", ["version_VIVO"], function() {
  406. // 如果项目中游engine文件夹,我们默认该开发者是熟悉VIVO发布流程的,已经处理好所有的逻辑
  407. // 值得注意的:
  408. // 1) 如果有engine文件夹而未处理2D物理库(box2d.js/physics.js),项目将无法运行
  409. // 2) 如果未处理3D物理库(physics3D.js),打包时间将会很长
  410. // 如果不是vivo快游戏
  411. if (platform !== "vivogame") {
  412. return;
  413. }
  414. let engineFolder = path.join(projDir, "src", "engine");
  415. isExistEngineFolder = fs.existsSync(engineFolder);
  416. if (!isExistEngineFolder) {
  417. return;
  418. }
  419. let adapterOriginalPath = path.join(projDir, "src", "qgame-adapter.js");
  420. let vivoConfigPath = path.join(ideModuleDir, "../", "out", "layarepublic", "LayaAirProjectPack", "lib", "data", "addi", "vivo");
  421. // 不想写一堆task任务,500ms默认拷贝完成吧
  422. // 未来有了更好的解决方案再修改
  423. return new Promise(function(resolve, reject) {
  424. // 拷贝webpack.config.js
  425. setTimeout(resolve, 500);
  426. var stream = gulp.src([`${vivoConfigPath}/**/*.*`]);
  427. return stream.pipe(gulp.dest(projDir));
  428. }).then(function() {
  429. return new Promise(function(resolve, reject) {
  430. // 将engine文件夹拷贝到projRoot下
  431. setTimeout(resolve, 500);
  432. var stream = gulp.src([`${engineFolder}/**/*.*`], {base: `${projDir}/src`});
  433. return stream.pipe(gulp.dest(projDir));
  434. });
  435. }).then(function() {
  436. return new Promise(function(resolve, reject) {
  437. // 将adapter.js拷贝到engine文件夹中
  438. setTimeout(resolve, 500);
  439. var stream = gulp.src([adapterOriginalPath]);
  440. return stream.pipe(gulp.dest(`${projDir}/engine`));
  441. });
  442. }).then(function() {
  443. return new Promise(function(resolve, reject) {
  444. // 删掉src下的engine和adapter
  445. setTimeout(resolve, 500);
  446. return del([engineFolder, adapterOriginalPath], { force: true });
  447. });
  448. }).catch(function(err) {
  449. console.log(err);
  450. });
  451. });
  452. gulp.task("dealEngineFolder2_VIVO", ["dealEngineFolder1_VIVO"], function() {
  453. // 如果不是vivo快游戏
  454. if (platform !== "vivogame") {
  455. return;
  456. }
  457. if (!isExistEngineFolder) {
  458. return;
  459. }
  460. let engineFolder = path.join(projDir, "engine");
  461. let engineFileList = fs.readdirSync(engineFolder);
  462. // 修改webpack.config.js
  463. let vvConfigPath = path.join(projDir, "config", "webpack.config.js");
  464. let content = fs.readFileSync(vvConfigPath, "utf8");
  465. let externalsStr = '{\n';
  466. let libName;
  467. for (let i = 0, len = engineFileList.length; i < len; i++) {
  468. libName = engineFileList[i];
  469. if (i !== 0) {
  470. externalsStr += ',\n';
  471. }
  472. externalsStr += `'./${libName}':'commonjs ./${libName}'`;
  473. }
  474. externalsStr += '\n}';
  475. content = content.replace("EXTERNALS_PLACE_HOLDER", externalsStr);
  476. fs.writeFileSync(vvConfigPath, content, "utf8");
  477. });
  478. // 如果项目中用到了 box2d.js|laya.physics.js/laya.physics3D.js ,需要特殊处理
  479. gulp.task("dealNoCompile1_VIVO", ["dealEngineFolder2_VIVO"], function() {
  480. // 如果不是vivo快游戏
  481. if (platform !== "vivogame") {
  482. return;
  483. }
  484. if (isExistEngineFolder) {
  485. return;
  486. }
  487. // 如果没有使用物理,则忽略这一步
  488. let indexJsStr = (versionCon && versionCon["index.js"]) ? versionCon["index.js"] : "index.js";
  489. let box2dJsStr = (versionCon && versionCon["libs/box2d.js"]) ? versionCon["libs/box2d.js"] : "libs/box2d.js";
  490. let physicsJsStr = (versionCon && versionCon["libs/laya.physics.js"]) ? versionCon["libs/laya.physics.js"] : "libs/laya.physics.js";
  491. let physics3DJsStr = (versionCon && versionCon["libs/laya.physics3D.js"]) ? versionCon["libs/laya.physics3D.js"] : "libs/laya.physics3D.js";
  492. let filePath = path.join(projSrc, indexJsStr);
  493. if (!fs.existsSync(filePath)) {
  494. return;
  495. }
  496. isDealNoCompile = true;
  497. // 拷贝webpack.config.js
  498. let vivoConfigPath = path.join(ideModuleDir, "../", "out", "layarepublic", "LayaAirProjectPack", "lib", "data", "addi", "vivo");
  499. let copyConfigList = [`${vivoConfigPath}/**/*.*`];
  500. var stream = gulp.src(copyConfigList);
  501. return stream.pipe(gulp.dest(projDir));
  502. });
  503. gulp.task("dealNoCompile2_VIVO", ["dealNoCompile1_VIVO"], function() {
  504. // 如果不是vivo快游戏
  505. if (platform !== "vivogame") {
  506. return;
  507. }
  508. if (!isDealNoCompile) {
  509. return;
  510. }
  511. let indexJsStr = (versionCon && versionCon["index.js"]) ? versionCon["index.js"] : "index.js";
  512. let bundleJsStr = (versionCon && versionCon["js/bundle.js"]) ? versionCon["js/bundle.js"] : "js/bundle.js";
  513. let box2dJsStr = (versionCon && versionCon["libs/box2d.js"]) ? versionCon["libs/box2d.js"] : "libs/box2d.js";
  514. let physicsJsStr = (versionCon && versionCon["libs/laya.physics.js"]) ? versionCon["libs/laya.physics.js"] : "libs/laya.physics.js";
  515. let physics3DJsStr = (versionCon && versionCon["libs/laya.physics3D.js"]) ? versionCon["libs/laya.physics3D.js"] : "libs/laya.physics3D.js";
  516. // 修改index.js,去掉物理库前面的libs
  517. let filePath = path.join(projSrc, indexJsStr);
  518. let fileContent = fs.readFileSync(filePath, "utf8");
  519. let physicsNameList = [];
  520. if (fileContent.includes(bundleJsStr)) {
  521. let adapterJsPath = path.join(projSrc, bundleJsStr);
  522. physicsNameList.push(bundleJsStr);
  523. physicsLibsPathList.push(adapterJsPath);
  524. }
  525. if (fileContent.includes(box2dJsStr)) {
  526. let libPath = path.join(projSrc, box2dJsStr);
  527. physicsNameList.push(box2dJsStr);
  528. physicsLibsPathList.push(libPath);
  529. }
  530. if (fileContent.includes(physicsJsStr)) {
  531. let libPath = path.join(projSrc, physicsJsStr);
  532. physicsNameList.push(physicsJsStr);
  533. physicsLibsPathList.push(libPath);
  534. }
  535. if (fileContent.includes(physics3DJsStr)) {
  536. let libPath = path.join(projSrc, physics3DJsStr);
  537. physicsNameList.push(physics3DJsStr);
  538. physicsLibsPathList.push(libPath);
  539. }
  540. if (physicsLibsPathList.length > 0) {
  541. let adapterJsPath = path.join(projSrc, "qgame-adapter.js");
  542. physicsNameList.push("qgame-adapter.js");
  543. physicsLibsPathList.push(adapterJsPath);
  544. }
  545. // 修改webpack.config.js
  546. let vvConfigPath = path.join(projDir, "config", "webpack.config.js");
  547. let content = fs.readFileSync(vvConfigPath, "utf8");
  548. let externalsStr = '{\n';
  549. let libName;
  550. for (let i = 0, len = physicsNameList.length; i < len; i++) {
  551. libName = physicsNameList[i];
  552. if (i !== 0) {
  553. externalsStr += ',\n';
  554. }
  555. externalsStr += `'./${libName}':'commonjs ./${libName}'`;
  556. }
  557. externalsStr += '\n}';
  558. content = content.replace("EXTERNALS_PLACE_HOLDER", externalsStr);
  559. fs.writeFileSync(vvConfigPath, content, "utf8");
  560. // 将物理库、qgame-adapter.js拷贝到engine中
  561. var stream = gulp.src(physicsLibsPathList, {base: projSrc});
  562. return stream.pipe(gulp.dest(path.join(projDir, "engine")));
  563. });
  564. gulp.task("dealNoCompile3_VIVO", ["dealNoCompile2_VIVO"], function() {
  565. // 如果不是vivo快游戏
  566. if (platform !== "vivogame") {
  567. return;
  568. }
  569. if (!isDealNoCompile || physicsLibsPathList.length === 0) {
  570. return;
  571. }
  572. return del(physicsLibsPathList, { force: true });
  573. });
  574. // 打包rpk
  575. gulp.task("buildRPK_VIVO", ["dealNoCompile3_VIVO"], function() {
  576. // 如果不是vivo快游戏
  577. if (platform !== "vivogame") {
  578. return;
  579. }
  580. // 在vivo轻游戏项目目录中执行:
  581. // npm run build || npm run release
  582. let cmdStr = "build";
  583. if (config.vivoInfo.useReleaseSign) {
  584. cmdStr = "release";
  585. }
  586. return new Promise((resolve, reject) => {
  587. let cmd = `npm${commandSuffix}`;
  588. let args = ["run", cmdStr];
  589. let opts = {
  590. cwd: projDir
  591. };
  592. let cp = childProcess.spawn(cmd, args, opts);
  593. // let cp = childProcess.spawn(`npx${commandSuffix}`, ['-v']);
  594. cp.stdout.on('data', (data) => {
  595. console.log(`stdout: ${data}`);
  596. });
  597. cp.stderr.on('data', (data) => {
  598. console.log(`stderr: ${data}`);
  599. console.log(`stderr(iconv): ${iconv.decode(data, 'gbk')}`);
  600. // reject();
  601. });
  602. cp.on('close', (code) => {
  603. console.log(`子进程退出码:${code}`);
  604. resolve();
  605. });
  606. });
  607. });
  608. gulp.task("showQRCode_VIVO", ["buildRPK_VIVO"], function() {
  609. // 如果不是vivo快游戏
  610. if (platform !== "vivogame") {
  611. return;
  612. }
  613. // 在vivo轻游戏项目目录中执行:
  614. // npm run server
  615. return new Promise((resolve, reject) => {
  616. let cmd = `npm${commandSuffix}`;
  617. let args = ["run", "server"];
  618. let opts = {
  619. cwd: projDir
  620. };
  621. let cp = childProcess.spawn(cmd, args, opts);
  622. // let cp = childProcess.spawn(`npx${commandSuffix}`, ['-v']);
  623. cp.stdout.on('data', (data) => {
  624. console.log(`${data}`);
  625. // 输出pid,macos要用: macos无法kill进程树,也无法执行命令获取3000端口pid(没有查询权限),导致无法kill这个进程
  626. console.log('vv_qrcode_pid:' + cp.pid);
  627. });
  628. cp.stderr.on('data', (data) => {
  629. console.log(`stderr: ${data}`);
  630. console.log(`stderr(iconv): ${iconv.decode(data, 'gbk')}`);
  631. // reject();
  632. });
  633. cp.on('close', (code) => {
  634. console.log(`子进程退出码:${code}`);
  635. resolve();
  636. });
  637. });
  638. });
  639. gulp.task("buildVivoProj", ["showQRCode_VIVO"], function() {
  640. console.log("all tasks completed");
  641. });