diff --git a/publish/build.sh b/publish/build.sh
index 02779c581b2b92b339cc91cc4f9c681883e5debb..f7fcf17e83830cc2ad86e5f4cfcdbf5c562cd1b0 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 0000000000000000000000000000000000000000..9c1cd8f5511b0fb2fa100dffaf52647f0648189e
--- /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 0000000000000000000000000000000000000000..dff2b7f39c7e65309eda3f85cc99c9e54aa887f6
--- /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 0000000000000000000000000000000000000000..d0e5a85f1b302481296493ed4e69a62dafefb27c
--- /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 0000000000000000000000000000000000000000..e8d672bb9815dbd3abb0646451da6bc173a64795
--- /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 0000000000000000000000000000000000000000..b1b1bc4d2dde903191ef989aa6edff91224de2a1
--- /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 0000000000000000000000000000000000000000..24ee7470a121168b8a72434095d36888634d9a36
--- /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);
+ }
+}