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