From 0a424185fcd713267cb391af49b3fed30cd7b012 Mon Sep 17 00:00:00 2001
From: fanxuehan <fanxuehan@qq.com>
Date: Mon, 15 Mar 2021 14:20:14 +0800
Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9Eapp=E6=89=93=E5=8C=85?=
 =?UTF-8?q?=E8=84=9A=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 publish/build.sh        | 44 ++++++++++++++++++++++++++++++--
 publish/build_check.js  | 32 +++++++++++++++++++++++
 publish/build_step_0.js | 16 ++++++++++++
 publish/build_step_1.js | 37 +++++++++++++++++++++++++++
 publish/build_step_2.js | 10 ++++++++
 publish/build_step_3.js | 56 +++++++++++++++++++++++++++++++++++++++++
 publish/utils.js        | 56 +++++++++++++++++++++++++++++++++++++++++
 7 files changed, 249 insertions(+), 2 deletions(-)
 create mode 100644 publish/build_check.js
 create mode 100644 publish/build_step_0.js
 create mode 100644 publish/build_step_1.js
 create mode 100644 publish/build_step_2.js
 create mode 100644 publish/build_step_3.js
 create mode 100644 publish/utils.js

diff --git a/publish/build.sh b/publish/build.sh
index 02779c5..f7fcf17 100644
--- a/publish/build.sh
+++ b/publish/build.sh
@@ -1,15 +1,55 @@
 #!/bin/sh
 
-cd form 
+cd publish 
+
+set -e
+
+node build_check.js
+
+set +e
+
+cd ../form 
 
 npm install
 
 npm run publish 
 
+cd ../publish 
+
+node build_step_0.js
+
 cd ../play
 
 /Applications/CocosCreator/Creator/2.4.0/CocosCreator.app/Contents/MacOS/CocosCreator --path "./" --build "platform=web-desktop;debug=true" --force
 
+echo "生成 web desktop 完成~!"
+
 cd ../publish 
 
-node build.js
+node build_step_1.js
+
+echo "build_step_1 完成~!"
+
+cd ../play
+
+/Applications/CocosCreator/Creator/2.4.4/CocosCreator.app/Contents/MacOS/CocosCreator --path "./" --build "platform=ios;debug=false;md5Cache=true;buildPath=build_ios;encryptJs=true;xxteaKey=6bbfce23-28b4-4a;zipCompressJs=true" --force
+
+echo "生成 ios 完成~!"
+
+cd ../publish 
+
+node build_step_2.js
+
+echo "build_step_2 完成~!"
+
+cd ../play
+
+/Applications/CocosCreator/Creator/2.4.4/CocosCreator.app/Contents/MacOS/CocosCreator --path "./" --build "platform=ios;debug=false;md5Cache=true;buildPath=build_android;appABIs=['armeabi-v7a','x86','x86_64','arm64-v8a'];encryptJs=true;xxteaKey=6bbfce23-28b4-4a;zipCompressJs=true" --force
+
+echo "生成 android 完成~!"
+
+cd ../publish 
+
+node build_step_3.js
+
+echo "build_step_3 完成~!"
diff --git a/publish/build_check.js b/publish/build_check.js
new file mode 100644
index 0000000..9c1cd8f
--- /dev/null
+++ b/publish/build_check.js
@@ -0,0 +1,32 @@
+let fs = require('fs');
+
+const dirNames = __dirname.split('/');
+const projectName = dirNames[dirNames.length - 2];
+const path = '../play/assets'
+let folderName = '';
+fs.readdirSync(path).find(fileName => {
+  const st = fs.statSync(`${path}/${fileName}`);
+  if (st.isDirectory()) {
+    folderName = fileName;
+  }
+});
+
+if (projectName != folderName) {
+  throw (`项目名(${projectName})与bundle文件夹名(${folderName})不相同`);
+}
+let same = false;
+const files = fs.readdirSync(`${path}/${folderName}/scene`);
+files.forEach(fileName => {
+  fileName.split('.').forEach((str, idx, arr) => {
+    if (str == 'fire') {
+      const sceneName = arr[idx - 1];
+      if (folderName == sceneName) {
+        same = true;
+      }
+    }
+  })
+});
+
+if (!same) {
+  throw (`bundle文件夹名称(${folderName})与scene名称不相同`);
+}
\ No newline at end of file
diff --git a/publish/build_step_0.js b/publish/build_step_0.js
new file mode 100644
index 0000000..dff2b7f
--- /dev/null
+++ b/publish/build_step_0.js
@@ -0,0 +1,16 @@
+let fs = require('fs');
+
+const path = '../play/assets'
+
+let folderName = '';
+fs.readdirSync(path).find(fileName => {
+  const st = fs.statSync(`${path}/${fileName}`);
+  if (st.isDirectory()) {
+    folderName = fileName;
+  }
+});
+const metaPath = `${path}/${folderName}.meta`;
+const metaDataStr = fs.readFileSync(metaPath);
+const metaData = JSON.parse(metaDataStr);
+metaData.isBundle = false;
+fs.writeFileSync(metaPath, JSON.stringify(metaData));
diff --git a/publish/build_step_1.js b/publish/build_step_1.js
new file mode 100644
index 0000000..d0e5a85
--- /dev/null
+++ b/publish/build_step_1.js
@@ -0,0 +1,37 @@
+const { removeDir, copyDir, fix2 } = require('./utils');
+const compressing = require('compressing');
+let fs = require('fs');
+
+async function main() {
+  await removeDir('./publish/play');
+  await removeDir('./publish/form');
+
+  await copyDir('../play/build/web-desktop', './publish/play');
+  compressing.zip.uncompress('../form/publish/form.zip', './publish/form');
+
+  const data = await fs.readFileSync('./index.html');
+  await fs.writeFileSync('./publish/play/index.html', data);
+
+  await removeDir('../play/build/web-desktop');
+
+
+  const path = '../play/assets'
+  let folderName = '';
+  fs.readdirSync(path).find(fileName => {
+    const st = fs.statSync(`${path}/${fileName}`);
+    if (st.isDirectory()) {
+      folderName = fileName;
+    }
+  });
+  const metaPath = `${path}/${folderName}.meta`;
+  const metaDataStr = fs.readFileSync(metaPath);
+  const metaData = JSON.parse(metaDataStr);
+  metaData.isBundle = true;
+  metaData.isRemoteBundle = {
+    ios: true,
+    android: true
+  };
+  fs.writeFileSync(metaPath, JSON.stringify(metaData));
+}
+
+main();
\ No newline at end of file
diff --git a/publish/build_step_2.js b/publish/build_step_2.js
new file mode 100644
index 0000000..e8d672b
--- /dev/null
+++ b/publish/build_step_2.js
@@ -0,0 +1,10 @@
+const { removeDir, copyDir, fix2 } = require('./utils');
+const compressing = require('compressing');
+
+async function main() {
+  await removeDir('./publish/ios');
+  await copyDir('../play/build_ios/jsb-link/remote', './publish/ios');
+  await removeDir('../play/build_ios/jsb-link');
+}
+
+main();
\ No newline at end of file
diff --git a/publish/build_step_3.js b/publish/build_step_3.js
new file mode 100644
index 0000000..b1b1bc4
--- /dev/null
+++ b/publish/build_step_3.js
@@ -0,0 +1,56 @@
+const { removeDir, copyDir, fix2 } = require('./utils');
+const compressing = require('compressing');
+let fs = require('fs');
+
+async function main() {
+  await removeDir('./publish/android');
+  await copyDir('../play/build_android/jsb-link/remote', './publish/android');
+  await removeDir('../play/build_android/jsb-link');
+
+  const bundleData = {
+    ios: await getBundleData('./publish/ios'),
+    android: await getBundleData('./publish/android'),
+  }
+
+  fs.writeFileSync('./publish/config.json', JSON.stringify(bundleData));
+
+  const tarStream = new compressing.zip.Stream();
+  tarStream.addEntry('./publish/play');
+  tarStream.addEntry('./publish/form');
+  tarStream.addEntry('./publish/ios');
+  tarStream.addEntry('./publish/android');
+  tarStream.addEntry('./publish/config.json');
+
+  const destStream = fs.createWriteStream(`publish/${getReleaseFileName()}.zip`);
+
+  tarStream.pipe(destStream);
+
+  console.log('打包完成!');
+}
+
+async function getBundleData(path) {
+  const bundleData = {
+    sceneName: '',
+    version: '',
+  }
+  const paths = fs.readdirSync(path);
+  bundleData.sceneName = paths[0];
+  const files = fs.readdirSync(path + '/' + bundleData.sceneName);
+  files.forEach(fileName => {
+    fileName.split('.').forEach((str, idx, arr) => {
+      if (str == 'config') {
+        bundleData.version = arr[idx + 1];
+      }
+    })
+  });
+  return bundleData;
+}
+
+function getReleaseFileName() {
+  let date = new Date();
+  let fileName = `Release_${date.getFullYear()}${fix2(date.getMonth() + 1)}${fix2(date.getDate())} `;
+  fileName += `${fix2(date.getHours())}-${fix2(date.getMinutes())}-${fix2(date.getSeconds())}`;
+  return fileName;
+}
+
+main();
\ No newline at end of file
diff --git a/publish/utils.js b/publish/utils.js
new file mode 100644
index 0000000..24ee747
--- /dev/null
+++ b/publish/utils.js
@@ -0,0 +1,56 @@
+let fs = require('fs');
+
+module.exports = {
+  fix2: function (num) {
+    if (num >= 10) {
+      return '' + num;
+    } else {
+      return '0' + num;
+    }
+  },
+
+  copyDir: async function (src, dst) {
+    const exists = await fs.existsSync(dst);
+    if (!exists) {
+      await fs.mkdirSync(dst);
+    }
+    //读取目录
+    const paths = await fs.readdirSync(src);
+    for (let i = 0; i < paths.length; i++) {
+      let path = paths[i];
+      const newSrc = `${src}/${path}`;
+      const newDst = `${dst}/${path}`;
+      const st = await fs.statSync(newSrc);
+      if (st.isFile()) {
+        console.log('copy: ' + newDst);
+        const data = await fs.readFileSync(newSrc);
+        await fs.writeFileSync(newDst, data);
+      } else if (st.isDirectory()) {
+        arguments.callee(newSrc, newDst);
+      }
+    }
+  },
+
+  removeDir: async function (src) {
+    const exists = await fs.existsSync(src);
+    if (!exists) {
+      return;
+    }
+
+    //读取目录
+    const st = await fs.statSync(src);
+    const paths = await fs.readdirSync(src);
+    for (let i = 0; i < paths.length; i++) {
+      let path = paths[i];
+      const newSrc = `${src}/${path}`;
+      const st = await fs.statSync(newSrc);
+      if (st.isFile()) {
+        console.log('remove: ' + newSrc);
+        await fs.unlinkSync(newSrc);
+      } else if (st.isDirectory()) {
+        await arguments.callee(newSrc);
+      }
+    }
+    await fs.rmdirSync(src);
+  }
+}
-- 
2.21.0