weex更新方案探索(六)
来源:互联网 发布:github 怎么浏览源码 编辑:程序博客网 时间:2024/06/05 23:40
created by zhenggl
weex更新方案的探索,总结归档成系列文章:
1. weex更新方案探索(一)【weex更新方案整体思路】
2. weex更新方案探索(二)【weex更新方案vue端实现】
3. weex更新方案探索(三)【weex更新方案IOS端实现】
4. weex更新方案探索(四)【weex更新方案Android端实现】
5. weex更新方案探索(五)【weex更新方案服务器端实现】
6. weex更新方案探索(六)【创建工具构建版本配置文件】【本篇】
7. weex更新方案探索(七)【遗留问题或后续工作】
weex更新方案探索(六)——创建工具构建版本配置文件
维护版本配置文件,也是个工作量不少的繁琐工作,必须想办法减少这类工作占用人力资源。鉴于weex开发都配置好了node,决定采用nodejs编写脚本工具,助力版本配置文件的维护。
升级配置josn文件结构:
{ "version": "1.0", "list": [ { "fileName": "history_order.js", "version": "1.0", "downloadUrl": "dist/business/history_order.js", "localUrl": "", "onlineUrl": "http://www.xxxx.com/xxx/dist/business/history_order.js", "isUseOnline": "false", "fileMD5": "789A7E960D581C79BAD891B8BC12B30C" }, ... ], "zip": { "fileName": "dist.zip", "version": "1.0", "downloadUrl": "dist.zip", "localUrl": "", "fileMD5": "DB664CD6FF92D6F01A67D7E6BAAA77D2" }}
设想:
在目标文件夹下,放置脚本,命令行运行脚本,即可生成升级配置json文件(支持逐个文件更新方式,同时也支持zip增量更新方式;支持本地文件MD5防篡改;)
思路:
- 遍历目标文件夹目录,获取所有目标文件,组装相关参数(版本号,文件名、下载路径、在线路径、是否使用在线文件,该文件MD5,文件大小等)用数组缓存起来;
- 文件排序(按大小或名称,或自定义排序策略),非必要;
- 根据升级配置json文件的结构,将上述所获取到的参数,组装成json字符串(过滤掉非目标文件);
- 将json字符串保存成json文件到目标文件夹下;
- 目的达到,完成;
代码实现:
工具文件名称:tool_create_upgrade_file.js
////////////////////////////////////////////////////////按目录遍历所有文件,生成升级配置的json文件//create by zhengguoli//20171101////参考://http://nodeclass.com/articles/911572//http://blog.csdn.net/coding_my_future/article/details/51286740//https://cnodejs.org/topic/5305bcf96c0325e50133ec92//使用说明://1、将该文件说于dist同级目录下//2、压缩dist文件夹,生成dist.zip压缩文件(此步骤可用脚本实现,鉴于压缩库或第三方工具需要另外安装依赖,此脚本不作压缩处理的实现)//3、命令行运行命令:node tool_create_upgrade_file.js//4、回车,在该文件同级目录下查找upgrade.json文件//////////////////////////////////////////////////////// console.log(process.execPath);// console.log(__dirname);// console.log(process.cwd());//相关变量定义//要计算MD5文件的目录var localFold = __dirname; //"/Library/WebServer/Documents/testUpgrade/md5";//输出的文件名,在当前js文件所在目录下var outputFileName = "upgrade.json";//var rootFoldFillter = "dist";//文件路径识别符,用于截取后面的相对路径var fillter = rootFoldFillter + "/business"; //"dist/business";//升级的版本号var version = "1.0";//在线的路径前缀,fillter前面的部分var serverUrl = "http://www.xxx.com/xxxx/"; //"http://192.168.1.122/testUpgrade/";//是否使用在线资源(目前该参数是全局的,所有的文件都共用,如果个别在采用在线的,则需手动查找并修改为true)var isUseOnline = "false";//不获取的文件列表(忽略列表)var notGetList = [ ".DS_Store", //"tool_get_md5.js", "tool_create_upgrade_file.js", outputFileName];//引入模块//文件处理所需要模块var fs = require('fs');//MD5处理所需要模块var crypto = require('crypto');//相关方法定义//遍历文件夹,获取所有文件夹里面的文件信息function geFileList(path) { var filesList = []; readFile(path,filesList); return filesList;}//遍历读取文件function readFile(path, filesList) { files = fs.readdirSync(path);//需要用到同步读取 files.forEach(walk); function walk(file) { console.log("fullPath=" + path+'/'+file); states = fs.statSync(path+'/'+file); if(states.isDirectory()) { readFile(path+'/'+file,filesList); } else { //计算MD5(计算大文件用) // var fullPath = path + '/' + file; // var rs = fs.createReadStream(fullPath); // var hash = crypto.createHash('md5'); // rs.on('data', hash.update.bind(hash)); // rs.on('end', function () { // var md5 = hash.digest('hex'); // md5 = md5.toUpperCase(); // console.log("path=" + fullPath + ", md5=" + md5); // //创建一个对象保存信息 // var obj = new Object(); // obj.size = states.size;//文件大小,以字节为单位 // obj.name = file;//文件名 // obj.path = fullPath; //文件绝对路径 // obj.md5 = md5; // filesList.push(obj); // }); var fullPath = path + '/' + file; var data = fs.readFileSync(fullPath, "utf-8"); var hash = crypto.createHash('md5'); hash.update(data); var md5 = hash.digest('hex'); md5 = md5.toUpperCase(); //console.log("path=" + fullPath + ", md5=" + md5); //从fullPath 中截取 fillter及后面的字符串 var lastFilePath = fullPath; var fileName = fullPath; var pos = fullPath.indexOf(fillter); if (pos > -1) { lastFilePath = fullPath.slice(pos); fileName = lastFilePath.slice(fillter.length + 1); } else { //fullPath中没有包含fillter,则去除当前目录所在前缀 pos = fullPath.indexOf(localFold); if (pos > -1) { console.log("__________pos=" + pos); lastFilePath = fullPath.slice(pos + localFold.length + 1); var p = lastFilePath.lastIndexOf("/"); if (p > -1) { fileName = lastFilePath.slice(p + 1); } else { fileName = lastFilePath; } } } console.log("lastFilePath=" + lastFilePath); console.log("fileName=" + fileName); //创建一个对象保存信息 var obj = new Object(); obj.size = states.size;//文件大小,以字节为单位 obj.path = fullPath; //文件绝对路径 obj.name = file; obj.fileName = fileName; obj.version = version; obj.downloadUrl = lastFilePath; obj.localUrl = ""; //空,让B端处理填充 obj.onlineUrl = serverUrl + lastFilePath; obj.isUseOnline = isUseOnline; obj.fileMD5 = md5; filesList.push(obj); //计算MD5 } }}//写入文件utf-8格式function writeFile(fileName, data, allFilesCount) { fs.writeFile(fileName,data,'utf-8', function(){ console.log(outputFileName + " 文件生成成功(共计:" + allFilesCount + "个文件)" + " 文件位于:" + localFold + "/" + outputFileName); });}//执行//一、遍历指定文件目录,获取所有目标文件,组装相关参数返回数组var filesList = geFileList(localFold);//二、排序,按文件大小 从小到大排序// filesList.sort(sortHandler);// function sortHandler(a,b)// {// if(a.size > b.size)// return -1;// else if(a.size < b.size) return 1// return 0;// }//三、组装json字符串var allCount = 0;var str='{' + "\n";str += "\t" + '"version": "' + version + '", ' + "\n";str += "\t" + '"list": [' + "\n";var zip = null;for (var i=0;i<filesList.length;i++) { var item = filesList[i]; // if (item.fileName == ".DS_Store" || item.fileName == "tool_get_md5.js" || item.fileName == outputFileName) { // continue; // } var isNotGet = false; for (var j=0; j<notGetList.length; j++) { if (item.fileName.indexOf(notGetList[j]) > -1) { isNotGet = true; break; } } if (isNotGet) { continue; } if (item.fileName == rootFoldFillter + ".zip") { zip = "\t" + '"zip": ' + '{' + "\n" + "\t\t" + '"fileName": "' + item.fileName + '", ' + "\n" + "\t\t" + '"version": "' + item.version + "" + '", ' + "\n" + "\t\t" + '"downloadUrl": "' + item.downloadUrl + '", ' + "\n" + "\t\t" + '"localUrl": "' + item.localUrl + '", ' + "\n" + "\t\t" + '"fileMD5": "' + item.fileMD5 + '"' + "\n" + "\t" + '}'; continue; } // var data = "\t\t\t" + '"fileSize": "' + (item.size/1024).toFixed(2) + " kb" + '", ' + "\n" + // "\t\t\t" + '"filePath": "' + item.path '"'; var data = "\t\t\t" + '"fileName": "' + item.fileName + '", ' + "\n" + "\t\t\t" + '"version": "' + item.version + "" + '", ' + "\n" + "\t\t\t" + '"downloadUrl": "' + item.downloadUrl + '", ' + "\n" + "\t\t\t" + '"localUrl": "' + item.localUrl + '", ' + "\n" + "\t\t\t" + '"onlineUrl": "' + item.onlineUrl + '", ' + "\n" + "\t\t\t" + '"isUseOnline": "' + item.isUseOnline + '", ' + "\n" + "\t\t\t" + '"fileMD5": "' + item.fileMD5 + '"'; //console.log("___data=" + data); // if (i == filesList.length-1) { // str += "\t\t" + '{' + "\n" + // data + "\n" + // "\t\t" + '}' + "\n"; // } else { // str += "\t\t" + '{' + "\n" + // data + "\n" + // "\t\t" + '}, ' + "\n"; // } str += "\t\t" + '{' + "\n" + data + "\n" + "\t\t" + '}, ' + "\n"; allCount += 1;}//判断最后是否有', \n',有则替换成' \n'var tmp = ', \n';var lastPos = str.indexOf(', \n', str.length - tmp.length - 1);//console.log("____lastPos=" + lastPos + ", all=" + str.length);if ( lastPos > -1) { //存在,则去除 str = str.substring(0, lastPos); //console.log("_____str=" + str); //再补充 str += ' \n';}// str += "\t" + ']' + "\n";// str += '}';if (zip && zip.length > 0) { str += "\t" + ']' + ", " + "\n"; str += zip + "\n"; str += '}';} else { str += "\t" + ']' + "\n"; str += '}';}//四、将json字符串,保存到文件中writeFile(outputFileName, str, allCount);
待优化:
- 脚本内实现目标文件夹的压缩,执行脚本,一气呵成实现升级配置文件的生成;
- 版本号是全局共用,对于增量更新,个别文件更新版本变更,需要手动调整生成的json配置文件;后期可实现h5编辑json文件的功能,达到读取配置、微调配置、再重新保存配置;甚至集成调用后台接口通知版本更新等等;
该脚本工具会根据实际的业务需求,持续调整、优化、更新…
(未完,持续更新中…)
阅读全文
0 0
- weex更新方案探索(六)
- weex更新方案探索(一)
- weex更新方案探索(三)
- weex更新方案探索(四)
- weex更新方案探索(五)
- weex更新方案探索(七)
- weex更新方案探索(二)
- weex 踩坑记(持续更新中……)
- weex 在线js文件下载(更新)机制分析
- (六)颜色方案
- 探索工作流(六)--多线程
- 腾讯开源手游热更新方案Xlua尝鲜(六)——xLua的相关API
- ROSjava探索(更新完结)
- Android开发艺术探索(六)
- Weex使用(1)
- Weex
- weex
- WEEX
- Android环信设置聊天头像问题
- python内置函数的一些整理
- 安卓项目易用Ohttp封装
- Java bean 是个什么概念?
- 使PowerShell拥有Ubuntu默认终端界面
- weex更新方案探索(六)
- 刷新一下字节度量...(1BB)
- 阿里编码规约怎么使用?
- PMD安装和使用
- POJO与JavaBean的区别
- 正则表达式 regexp
- 使用bsd的queue.h实现简单队列
- java架构师之路:JAVA程序员必看的15本书的电子版下载地址
- Android Studio 快捷键 for Mac OS X