文档章节

gradle 修改java中的版本号

拉风的道长
 拉风的道长
发布于 2016/09/20 20:05
字数 645
阅读 756
收藏 13

        在做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。

© 著作权归作者所有

共有 人打赏支持
拉风的道长
粉丝 54
博文 110
码字总数 55629
作品 0
昌平
程序员
私信 提问
加载中

评论(2)

拉风的道长
拉风的道长

引用来自“alexqdjay”的评论

自动生成manifest,java去读是否可以
自动生成manifest,理论上是可以的。至少不动脑经的写就可以。
如果需要优雅一些,就需要一套Manifest模板,然后gralde去修改模板内容了。(这个我还没有遇到这样的需求,故提供思路,未实践过。)

不明白java去读是什么意思??
alexqdjay
alexqdjay
自动生成manifest,java去读是否可以
Learn Gradle - CH 3 Java 快速入门

上一章(链接)我们主要对Gradle的脚本进行了简要的介绍,本章我们将继续学习Gradle的另外一个特性——插件(plugins)。 1、插件介绍 插件是对Gradle功能的扩展,Gradle有着丰富的插件,你可...

Hassan
2015/07/26
0
0
Andriod studio 打包aar

因为项目不同,有些公用库而且还是c++的,还有一些带资源的,简单的复制遇到库升级又是一轮配置,编译成aar则解决这些麻烦。 但是默认andriod studio的make moudle只生成debug包,在3.0以上及...

breeze
2018/12/08
0
0
学习Android构建系统(五)-GradleWrapper、命令行和环境配置

前言 这三个知识点不难,但经常用到,如果不看官方文档,有时候并不知道怎么使用,出现问题也不知道原因,所以有必要做一个总结。由于每个知识点都不多,又有关联,所以放在同一节。 Gradle...

十思叶
2018/08/31
0
0
读懂 Gradle 的 DSL

现在 Android 开发免不了要和 Gradle 打交道,所有的 Android 开发肯定都知道这么在 中添加依赖,或者添加配置批量打包,但是真正理解这些脚本的人恐怕很少。其实 Gradle 的 可以说是一个代码...

sw926
02/12
0
0
翻译--Gradle之Java工程入门

我们已经看到Gradle是一个通用构建工具,它可以完成相当多的任务,只要你能在脚本里定义好。如果你没写好脚本,它就啥也干不成。 大部分Java项目都是这样的流程:编译源文件,单元测试,打成...

davelet
2014/01/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

netty

##1.Netty 简介 Netty is a NIO client server framework which enables quick and easy development of network applications such as protocol servers and clients. It greatly simplifi......

xpttxsok
55分钟前
2
0
Nginx 架构——【核心流程+模块介绍】

1. Nginx简介以及特点 Nginx简介: Nginx (engine x) 是一个高性能的Web服务器和反向代理服务器,也是一个IMAP/POP3/SMTP服务器 俄罗斯程序员Igor Sysoev于2002年开始 Nginx是增长最快的Web...

java知识分子
56分钟前
2
0
winscp中使用sudo的方法

用截图了解如何在 WinSCP 中使用 sudo。 首先你需要检查你尝试使用 WinSCP 连接的 sftp 服务器的二进制文件的位置。 你可以使用以下命令检查 SFTP 服务器二进制文件位置: [root@kerneltalk...

Linux就该这么学
今天
5
0
四、MyBatis中查询执行流程

一、查询执行大致流程 在MyBatis中,查询执行的大致流程如下: 对应的时序图如下: 二、MapperProxy绑定MappedStatement 在MyBatis Mapper Bean初始化深度解析中说过,mapper bean就是Mappe...

yangjianzhou
今天
3
0
系统幂等设计

前言 幂等简单的定义: 系统中的多次操作,不管多少次,都应该产生一样的效果,或返回一样的效果。 比如实际的业务请求为创建一个活动,理论上需要根据业务形态开发幂等创建活动的接口,这样...

春哥大魔王的博客
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部