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防篡改;)


思路:

  1. 遍历目标文件夹目录,获取所有目标文件,组装相关参数(版本号,文件名、下载路径、在线路径、是否使用在线文件,该文件MD5,文件大小等)用数组缓存起来;
  2. 文件排序(按大小或名称,或自定义排序策略),非必要;
  3. 根据升级配置json文件的结构,将上述所获取到的参数,组装成json字符串(过滤掉非目标文件);
  4. 将json字符串保存成json文件到目标文件夹下;
  5. 目的达到,完成;

代码实现:
工具文件名称: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);

待优化:

  1. 脚本内实现目标文件夹的压缩,执行脚本,一气呵成实现升级配置文件的生成;
  2. 版本号是全局共用,对于增量更新,个别文件更新版本变更,需要手动调整生成的json配置文件;后期可实现h5编辑json文件的功能,达到读取配置、微调配置、再重新保存配置;甚至集成调用后台接口通知版本更新等等;

该脚本工具会根据实际的业务需求,持续调整、优化、更新…


(未完,持续更新中…)

原创粉丝点击