Java根据SVN版本号生成H5游戏资源版本
来源:互联网 发布:mysql添加表分区 编辑:程序博客网 时间:2024/06/06 18:45
版本号自动化需求
H5游戏的庞大资源,每个资源的版本号不可能是手动维护,必须采用脚本或者软件来自动生成。
具体的版本号管理的问题,可以看我上篇文章:H5手游页游的资源版本管理。
以及另外一篇关于版本号的文章:Java自动生成H5游戏资源版文件的版本号
这里大部分原理机制是一样,生成的文件基本一样,只是这里是采用同svn的版本号作为资源的版本号,代替了之前版本的日期时间。主要原因是采用时间不太稳定,比如一天更改多次,或者从别的地方获取文件了,造成的时间都会不一样。
本文主要是用java实现了读取所有的资源文件,并且根据文件的在SVN的提交版本号作为相应的版本号,保存在一个文件里面,最终生成全部文件的版本号(具备默认的版本号,减少文件体积),压缩成zip在H5游戏中使用。
[本文例子]:没有提供下载,就一个类,后面贴出来了。
整体的实现步骤
- 通过svn指令获取到制定svn目录的所有文件版本号,并生成xml文件
svn status [path] -v --xml > E:\svn.xml
比如:
e:\svn\product\sofewares\svn1.8\svn.exe status e:\code\client\svnres\default\assets\ -v --xml > E:\svn.xml
在cmd下面执行这个语句就可以了,需要这主意的是,如果你的svn.exe没有配置倒环境变量去,则需要指明svn的全路径
可以看到生成的xml文件格式:
path="E:\svnres\icon\IT0123.png"><wc-status props="normal" item="normal" revision="11781"><commit revision="3582"><author>soda</author><date>2017-06-20T12:29:43.405326Z</date></commit></wc-status></entry>
我们需要提取的就是path和commit的版本号,单个文件提出是这样的结构:
icon\IT0123.png:3582
注意前面的路径去掉了,保持相对路径
2.利用Java程序解析xml文件,最终生成我们需要的资源版本号文件
Java实现思路过程
直接解析xml文件,提取里面的对应的path和commit的版本号,为每个文件生成svn版本号,最终生成一个大文件。不过同一个时间最多的文件,是不会记录起来,当作默认版本号。
- 使用默认路径或者从传递参数进来(svn路径和output输出路径)
可以是相对路径或者绝对路径,其中output是保存的文件,assets.bin为文本文件
2. 读取所有的文件,遍历并且存起来,同时把每个文件的时间和次数记起来。并且把最多的时间记起来。
遍历整个xml文件,并且把文件给记录起来(去掉默认版本号),并且生成。
把assets.bin转换成assets.cfg(zip文件)
一个bat脚本文件,自动执行版本程序,然后打包,并且上传到svn。
(这里算是伪脚本,主要原理是java执行完成之后,调用7z来压缩文本)
echo delete the assets.cfgdel ..\..\assets\assets.cfgdel ..\..\assets\assets.binecho Update the assets.cfg..\..\..\sofewares\svn1.8\svn.exe up ..\..\assetsjava -jar VersionBuilder.jarcd ..cd ..set assetPath=%cd%echo zip the assets.bin to assets.cfg..\sofewares\7z\7za.exe a -tzip %assetPath%\assets\assets.cfg %assetPath%\assets\assets.bin..\sofewares\svn1.8\svn.exe commit assets\assets.bin -m "update assets.bin"..\sofewares\svn1.8\svn.exe commit assets\assets.cfg -m "update assets.cfg"
最终生成的文本内容(部分):
4009,3072#roles/M014/M014_idle_e.json+roles/M014/M014_idle_es.json+roles/M014/M014_idle_n.json+roles/M014/M014_idle_ne.json+roles/M014/M014_idle_s.json+roles/M014/M014_run_e.json+roles/M014/M014_run_es.json+roles/M014/M014_run_n.json+roles/M014/M014_run_ne.json+roles/M014/M014_run_s.json+,8193#icon/functionButton/1100.png+icon/functionButton/1502.png+,9217#mornui/singleCopy/singleCopy.json+mornui/singleCopy/singleCopy.png+,9218#icon/halfRole/M002.png+icon/halfRole/M005.png+icon/halfRole/M006.png+icon/halfRole/M007.png
Java实现全部代码
代码有比较详细的注释,有问题的还可以留言。这个代码是可以正常使用的。
开发工具:Eclipse
就一个类,没有使用倒其他库,很简单,跟写个脚本差不多
/** * 资源版本管理器,根据SVN版本号生成游戏资源的版本信息 * Created by sodaChen on 2017/9/23. */public class SVNResVersion { public static void main(String[] args) throws Exception { //默认的保存路径 String input = "E://svn.xml"; String outPath = "E://assets.bin"; if(args != null && args.length == 2) { //获取传进来的路径 input = args[0]; outPath = args[1]; } else { System.out.println("没输入路径,使用默认的路径"); } System.out.println("资源路径" + input); System.out.println("输出路径" + outPath); //最多文件的版本号 int maxFileVersion = 0; //记录这个文件数量 //int maxFileVersionCount = 0; int fileCount = 0; HashMap<Integer,List<String>> versionMap = new HashMap<Integer,List<String>>(); //解析xml文件 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder dbBuilder = factory.newDocumentBuilder(); Document documet = dbBuilder.parse(input); //获取出根路径 Element element = (Element)documet.getElementsByTagName("target").item(0); String mainPath = element.getAttribute("path"); //替换回游戏中使用的路径 mainPath = mainPath.replaceAll("\\\\", "/") + "/"; //解析每一条svn资源的commit版本号 NodeList list = documet.getElementsByTagName("entry"); List<String> urlList = null; List<String> maxrlList = null; for(int i = 0; i < list.getLength(); i++) { element = (Element)list.item(i); String path = element.getAttribute("path"); File file = new File(path); //过滤掉svn目录 if(path.indexOf(".svn") != -1) { System.out.println("过滤掉.svn目录" ); return ; } if(file.isFile()) { fileCount++; //commit revision Element versionEle = (Element)(element.getElementsByTagName("commit").item(0)); if(versionEle == null) continue; path = path.replaceAll("\\\\", "/"); //替换掉前缀,保留相对路径 if(path.length() != mainPath.length()) path = path.replaceFirst(mainPath, ""); //去掉根目录,保存文件的相对路径 int version = Integer.parseInt( versionEle.getAttribute("revision") ); //System.out.println(path + ":" + version); urlList = versionMap.get(version); if(urlList == null) { urlList = new ArrayList<String>(); versionMap.put(version, urlList); } urlList.add(path); //记录最大版本号 if(maxrlList == null) { maxrlList = urlList; maxFileVersion = version; } else { //取比较大的作为最大版本号 if(urlList.size() > maxrlList.size()) { maxrlList = urlList; maxFileVersion = version; } } } } System.out.println("最多文件的版本号:" + maxFileVersion + " 数量:" + maxrlList.size()); System.out.println("处理文件数量:" + fileCount); //保存一份文本,用于方便查看 StringBuffer stringBuffer = new StringBuffer(); //默认版本号 stringBuffer.append(maxFileVersion + ","); //遍历所有的版本存储文件,进行版本号和文件的写入 System.out.println("版本号数量:" + versionMap.size()); for (int key : versionMap.keySet()) { urlList = versionMap.get(key); if(key != maxFileVersion) { stringBuffer.append(key + "#"); //文件长度 int length = urlList.size(); for(int i = 0; i < length; i++) { //分割符 stringBuffer.append(urlList.get(i) + "+"); } stringBuffer.append(","); } } //保存文本 //String url = outPath.replace(".bin", ".txt"); DataOutputStream assetsOutput = new DataOutputStream(new FileOutputStream(outPath)); assetsOutput.writeBytes(stringBuffer.toString()); try { assetsOutput.close(); } catch (Exception e) { // TODO: handle exception } }}
最终运行结果:
没输入路径,使用默认的路径资源路径E://svn.xml输出路径E://assets.bin最多文件的版本号:4009 数量:980处理文件数量:14815版本号数量:547
- Java根据SVN版本号生成H5游戏资源版本
- Java根据SVN版本号生成H5游戏资源版本
- Java自动生成H5游戏资源版文件的版本号
- Java自动生成H5游戏资源版文件的版本号
- eclipse中的Java文件自动根据svn版本号生成注释
- eclipse中的Java文件自动根据svn版本号生成注释
- SVN、GIT生成版本号
- SVN自动生成版本号
- VS之版本-编译时自动生成版本-自动获取svn版本号
- 让IAR生成SVN版本号
- Jenkins根据svn版本号进行构建
- Jenkins根据svn版本号进行构建
- 命令行SVN根据版本号查看文件路径
- 程序集版本最后一位使用SVN版本号的自动生成方法
- 程序集版本最后一位使用SVN版本号的自动生成方法
- vb.net 预生成事件获取SVN版本号,编译日期,版本日期
- 利用VS的预生成事件获取SVN版本作为项目内部版本号
- 程序集版本中使用SVN版本号自动生成方法详解
- [tomcat] 连接池参数maxActive、maxIdle 、maxWait 等
- linux调度器(十)——调度器/proc信息解读
- BZOJ2648:SJY摆棋子(KDtree)
- Android8.0“未知来源”安装
- 一些要填的坑
- Java根据SVN版本号生成H5游戏资源版本
- Web 开发者需要知道的 12 个终端命令
- 阿里技术走进硅谷:布局未来20年核心科技,为大数据和人工智能建立基础设施
- 趣图:程序员的“心”路历程
- 引用计数基本知识
- Web页面加载
- Revit抽取族参数信息
- [LeetCode] 690. Employee Importance
- 基于nodejs和activeMQ的消息推送