Java根据SVN版本号生成H5游戏资源版本

7 篇文章 0 订阅

版本号自动化需求

H5游戏的庞大资源,每个资源的版本号不可能是手动维护,必须采用脚本或者软件来自动生成。

具体的版本号管理的问题,可以看我上篇文章:H5手游页游的资源版本管理
以及另外一篇关于版本号的文章:Java自动生成H5游戏资源版文件的版本号

这里大部分原理机制是一样,生成的文件基本一样,只是这里是采用同svn的版本号作为资源的版本号,代替了之前版本的日期时间。主要原因是采用时间不太稳定,比如一天更改多次,或者从别的地方获取文件了,造成的时间都会不一样。

本文主要是用java实现了读取所有的资源文件,并且根据文件的在SVN的提交版本号作为相应的版本号,保存在一个文件里面,最终生成全部文件的版本号(具备默认的版本号,减少文件体积),压缩成zip在H5游戏中使用。

[本文例子]:没有提供下载,就一个类,后面贴出来了。

整体的实现步骤

  1. 通过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版本号,最终生成一个大文件。不过同一个时间最多的文件,是不会记录起来,当作默认版本号。

  1. 使用默认路径或者从传递参数进来(svn路径和output输出路径)

可以是相对路径或者绝对路径,其中output是保存的文件,assets.bin为文本文件
这里写图片描述
2. 读取所有的文件,遍历并且存起来,同时把每个文件的时间和次数记起来。并且把最多的时间记起来。
这里写图片描述

  1. 遍历整个xml文件,并且把文件给记录起来(去掉默认版本号),并且生成。

  2. 把assets.bin转换成assets.cfg(zip文件)
    一个bat脚本文件,自动执行版本程序,然后打包,并且上传到svn。
    (这里算是伪脚本,主要原理是java执行完成之后,调用7z来压缩文本)

echo delete the assets.cfg
del ..\..\assets\assets.cfg
del ..\..\assets\assets.bin
echo Update the assets.cfg
..\..\..\sofewares\svn1.8\svn.exe up  ..\..\assets
java -jar VersionBuilder.jar
cd ..
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
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 28
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值