gradle 修改java中的版本号

        在做SDK的时候,经常需要手动去修改版本号。比如

public class Version{
//先注释掉之前的版本号
   //   public static final String VERSION = "1.0";
//再写上新的版本号
      public static final String VERSION = "1.1";
}

这样的问题有两个:

1。重复劳动。完全是人工的。
2。遗漏的可能。 换个人去开发SDK了,可能就忘了修改这个VERSION了。

总之:靠人不靠谱。(强行安利一个电影:《我是谁:没有绝对安全的系统》。结局反转,黑客,人最不可靠)

接下来,借助gradle,实现一种编译时,自动修改版本号的方法。保证代码的随时更新。

一。何时运行?

修改版本号,肯定是在编译之前运行。不然都编译完了再去修改版本号有个毛意义啊?所以我们得找到gradle在编译之前可以进行的命令:preBuild。

在对应的app工程(或者library的工程)的build.gradle中,文件最后加入:

//编译之前,执行updateVerion
preBuild.dependsOn updateVersion

这句话就是在编译之前,依赖updateVersion。updateVersion就是我们要进行的task——去修改版本号。

二。写task脚本

假设Version.java的内容如下:

public class Version {
     public static final String VERSION = "2016-08-20";
}

(为了便于脚本修改,建议这个文件里面只有一个VERSION变量,其他不要有。当然只是建议)

在build.gradle中继续加入:

//替换版本号
task updateVersion << {
   //Version文件的目录。这里应该改为你的实际目录
    def versionFileDir = projectDir.getAbsolutePath() + File.separatorChar + 'Version.java';
    println versionFileDir;
   //读取旧的version字符串
    def oldVersionStr = findOldVersionStr(versionFileDir);
    println oldVersionStr;
   //获取新的version字符串
    def newVersionValue = getNewVersionValue();
    println newVersionValue;
   //拼接为java的语句
    def newVersionStr = "public static final String VERSION = \"" + newVersionValue + "\";"
    println newVersionStr;
   //重新写入到文件中
    def updatedContent = new File(versionFileDir).getText('UTF-8').replaceAll(oldVersionStr, newVersionStr);
    new File(versionFileDir).write(updatedContent, 'UTF-8')
}

//读取旧的version字符串
def findOldVersionStr(path) {
    def readerString = "";
    new File(path).withReader('UTF-8') { reader ->
        reader.eachLine {
            //读取一行,如果发现有"VERSION"字符,说明是我们要修改的那一行。
            if (it.contains("VERSION")) {
                //保存it到string,然后返回
                readerString <<= it
                return readerString
            }
        }
        return readerString
    }
}

//获取新的版本号
def getNewVersionValue() {
   //举例:用日期作为版本号
    def date = new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"));
    return date;
}

    rebuild运行之后,就会自动修改Version的值了。

 

总体流程就是:

    读取旧的一行文字,替换新的,然后重写进去。在编译前依赖一下task。

    原文作者:移动开发
    原文地址: https://my.oschina.net/lifj/blog/749345
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞