欢迎来真孝善网,为您提供真孝善正能量书籍故事!

使用Gradle和Git Hooks优化Android Studio项目提交流程

时间:11-16 现代故事 提交错误

其实使用Gradle和Git Hooks优化Android Studio项目提交流程的问题并不复杂,但是又很多的朋友都不太了解,因此呢,今天小编就来为大家分享使用Gradle和Git Hooks优化Android Studio项目提交流程的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!

下面分两部分介绍,分别是提交日志部分和代码检测部分。

提交日志的检查

要求

对于每个提交,Commit 消息包括三部分:页眉、正文和页脚。 ()://空行//空行其中,Header 为必填项,Body 和Footer 可以省略。

无论部分如何,任何行都不得超过72 个字符(或100 个字符)。这是为了防止自动换行影响外观。

Header 部分只有一行,包括三个字段:类型(必填)、范围(可选)和主题(必填)。

**type** 用于描述提交的类别。仅允许使用以下7 个标识符。

- feat:新功能(特性)

-fix: 修复错误

- docs: 文档(文档)

- style:格式(不影响代码运行的更改)

- refactor: 重构(即不是新功能或错误修复的代码更改)

- perf:性能优化(性能)

- test:添加测试

- Chore: 对构建过程或辅助工具的更改

- revert: 还有另一种特殊情况。如果当前提交用于撤消之前的提交,则必须以revert: 开头,后面是取消的Commit 的Header。

revert: feat(pencil): 添加"graphiteWidth" 选项

**scope**用于描述commit的影响范围,比如数据层、控制层、视图层等,根据项目的不同而不同。

**主题** 是提交目的的简短描述。

Body 部分的格式是固定的,必须写为This reverts commit hash.其中hash 是撤销提交的SHA 标识符。

实现

我们修改commit-msg 文件。由于我们对shell脚本不熟悉,所以通过python来实现。注意修改commit-msg文件顶部的代码。

将要

#!/bin/sh 修改为

#!/usr/bin/python2.6 否则python脚本将无法被识别

1、首先创建commit-msg相关的配置文件(commit-msg-config.txt),并将该文件放在与commit-msg同一目录下。我们在里面放入一些正则表达式和提示信息,方便后期修改和维护,commitMessageRegex=.+(nn.){0,2}

commitMessage=代码提交备注需要统一格式。格式为:n页眉(72个字符以内)+空行+正文(72个字符以内,可省略)+空行+页脚(72个字符以内,可省略);

HeadLengthMessage=标题中的字数不能超过72 个字符

HeadFormatMessage=Head 的格式为():type(必填)、scope(可选)和subject(必填)。 **type** 用于描述提交的类别。仅允许使用以下7 个标识符。 n**scope** 用于描述commit的影响范围,比如数据层、控制层、视图层等,根据项目的不同而不同。 n**主题** 是提交目的的简短描述

headTypeRegex=^(feat|修复|docs|style|refactor|perf|test|chore)((.*)){0,1}$|^revert$

headTypeMessage=type 可选值为: feat: 新函数(feature) fix: 修复bugndocs: 文档(documentation) style: 格式(不影响代码运行的改动) refactor: 重构(即不是新函数) ,也不是修复bug的代码)更改)perf:性能优化(性能)test:添加测试chore:构建过程或辅助工具的更改revert:当前提交用于撤消之前的提交

RevertCommitHeadMessage=您的类型是revert,必须以revert:开头,后面是撤回的Commit的Header。目前检测到撤回的Commit的Header格式不正确。

RevertMessage=您的类型是revert,必须以revert:开头,后面是未提交的Commit的Header。例如:n revert: feat(pencil): 添加"graphiteWidth" 选项

BodyLengthMessage=正文不能超过72 个字符

FootLengthMessage=Body不能超过72个字符2.修改commit-msg文件#!/usr/bin/python2.6

#编码=utf-8

#

# 用于检查提交日志消息的示例挂钩脚本。

# 由"git commit" 使用一个参数调用,即文件名

# 有提交消息。钩子应该以非零值退出

# 如果想要停止则发出适当的消息后的状态

犯罪。允许钩子编辑提交消息文件。

#

# 要启用此挂钩,请将此文件重命名为“commit-msg”。

# 取消注释以下内容以将Signed-off-by 行添加到消息中。

# 一般来说,在钩子中执行此操作是一个坏主意,但准备提交消息

#hook 更适合它。

#

# SOB=$(git var GIT_AUTHOR_IDENT | sed -n "s/^(.*).*$/Signed-off-by: 1/p")

# grep -qs "^$SOB" "$1" ||回声“$SOB”“$1”

# 此示例捕获重复的Signed-offby 行。

# 测试""="$(grep "^Signed-off-by: " "$1" |

# 排序| uniq-c| sed -e "/^[ ]*1[ ]/d")" || {

# echo 2 重复的签名行。

# 退出1

# }

进口再

导入系统

导入操作系统

地图=字典()

configFile=open(".git/hooks/commit-msg-config.txt","r")

对于open(".git/hooks/commit-msg-config.txt"): 中的行

行=configFile.readline()

值=line.split("=",2)

如果len(值)==2:

地图[值[0]]=值[1]

文件路径=sys.argv[1]

文件=打开(文件路径)

内容=file.read(os.path.getsize(filePath))

machObject=re.match(map["commitMessageRegex"], 内容, flags=0)

如果不是machObject:

打印地图["commitMessage"]

退出(1)

splitArray=content.split("nn",3)

if len(splitArray[0].decode("utf-8")) 73:

打印地图["HeadLengthMessage"]

退出(1)

头=splitArray[0]

splitHead=head.split(":",2)

如果len(splitHead) 2 或len(splitHead)3:

打印地图["HeadFormatMessage"]

退出(1)

machHead=re.match(map["headTypeRegex"],splitHead[0],flags=0)

如果不是machHead:

print (地图["headTypeMessage"])

退出(1)

如果splitHead[0]=="revert" 且len(splitHead)==3:

machRevertHead=re.match(headRegex,splitHead[1],flags=0)

如果不是machRevertHead:

打印地图["RevertCommitHeadMessage"]

退出(1)

否则:

打印地图["RevertMessage"]

退出(1)

如果len(splitArray) 1 和len(splitArray[1].decode("utf-8")) 73:

打印地图["BodyLengthMessage"]

退出(1)

如果len(splitArray) 2 和len(splitArray[2].decode("utf-8")) 73:

打印地图["FootLengthMessage"]

退出(1)

file.close()下面的代码用于读取我们之前创建的配置文件

地图=字典()

configFile=open(".git/hooks/commit-msg-config.txt","r")

对于open(".git/hooks/commit-msg-config.txt"): 中的行

行=configFile.readline()

值=line.split("=",2)

如果len(值)==2:

map[value[0]]=value[1] 这段代码用于读取我们提交的日志并判断其格式是否正确。

文件路径=sys.argv[1]

文件=打开(文件路径)

content=file.read(os.path.getsize(filePath)) 保存后,但是当我们再次通过git提交代码时,git hooks会检查日志。如果不符合格式,则会打印出错误并终止。提交操作。请记住,commit-msg 的后缀.sample 需要删除。如果还是不行的话可以通过

chmod a+x 提交消息

授予其读写权限。

提交代码的检查

原理

Android 的Gradle Api 本身具有checkStyle 类型的任务。我们需要应用checkstyle插件并实现这样一个任务来检查代码风格并生成检查报告。代码如下:

所有项目{

.

.

应用plugin:"checkstyle"

检查样式{

configFile rootProject.file("checkstyle.xml")

工具版本“6.19”

忽略失败false

显示违规行为true

}

任务("checkstyle",type: Checkstyle){

源“src/main/java”

包含“**/*.java”

排除“**/R.java”

排除“**/BuildConfig.java”

类路径=文件()

}

}可以通过hook git commit来执行这个脚本,然后根据检查结果决定是否提交。

实现

我们需要做的第一件事如下:

1.编写一个checkstyle xml文件。 2.使用checkstyletask的include和exclusion来添加必需和不必要的java类。 3.编写一个git hook文件来调用checkstyle任务并粘贴checkstyle xml文件。您可以根据自己的实际项目需求进行配置。

?xml version="1.0"?gradle中的exclude文件比较容易写,但是include要求我们只检查修改过的文件,否则每次检查整个项目会花费很多时间。

我们知道git status -s 可以获取修改后的文件字符串,所以我们在gradle中调用这个命令来获取修改后的文件列表。

def getChangeFiles() {

尝试{

String changeInfo="git status -s".execute(null, project.rootDir).text.trim()

返回changeInfo==null ? "" : 变更信息

} catch (异常e) {

返回""

}

然后解析这个字符串得到修改后的java文件类名集合。实现函数如下:

def filterCommitter(String gitstatusinfo) {

ArrayListfilterList=new ArrayList();

String[]lines=gitstatusinfo.split("\n")

for (字符串行: 行) {

if (line.contains(".java")) {

String[] spliters=line.trim().split(" ");

for (String str : splitters) {

if (str.contains(".java")) {

过滤列表.add(str)

}

}

}

}

返回过滤器列表;

这样,我们就可以将上述java文件包含在gradle中,然后我们可以使用gradle任务仅检查修改后的java文件的样式。

下面贴出gradle的完整代码

//顶级构建文件,您可以在其中添加所有子项目/模块通用的配置选项。

构建脚本{

存储库{

jcenter()

}

依赖项{

类路径"com.android.tools.build:gradle:2.1.0"

//注意: 不要将应用程序依赖项放在这里;他们属于

//在各个模块的build.gradle 文件中

}

}

所有项目{

存储库{

jcenter()

mavenCentral()

}

应用plugin:"checkstyle"

检查样式{

工具版本“6.13”

忽略失败false

显示违规行为true

}

}

任务清理(type: 删除){

删除rootProject.buildDir

}

任务checkstyle(type: Checkstyle) {

源“app/src/main/java”

排除“**/gen/**”

排除“**/R.java”

排除“**/BuildConfig.java”

if (project.hasProperty("checkCommit") project.property("checkCommit")) {

def ft=filterCommitter(getChangeFiles());

def includeList=new ArrayList()

for (int i=0; i ft.size(); i++) {

字符串分割器=ft.getAt(i)

String[] spliterlist=spliter.split("/")

字符串文件名=spliterlist[spliterlist.length - 1]

includeList.add("**/" + 文件名)

}

if (includeList.size()==0) {

排除“**/*.java”

} 别的{

println("includeList=="+includeList)

包含包含列表

}

} 别的{

包含“**/*.java”

}

configFile rootProject.file("checkstyle.xml")

类路径=文件()

}

def getChangeFiles() {

尝试{

String changeInfo="git status -s".execute(null, project.rootDir).text.trim()

返回changeInfo==null ? "" : 变更信息

} catch (异常e) {

返回""

}

}

def filterCommitter(String gitstatusinfo) {

ArrayListfilterList=new ArrayList();

String[]lines=gitstatusinfo.split("\n")

for (字符串行: 行) {

if (line.contains(".java")) {

String[] spliters=line.trim().split(" ");

for (String str : splitters) {

if (str.contains(".java")) {

过滤列表.add(str)

}

}

}

}

返回过滤器列表;

}在gradle文件中添加checkstyle任务后,我们还需要在git commit时自动检查它。这时候我们就需要修改git hook。

我们去掉./git/hook/pre-commit文件的.sample后缀,调用其中的gradle任务,通过任务的输出来判断是否可以提交。代码如下:

#!/bin/sh

#

# 用于验证将要提交的内容的示例挂钩脚本。

# 由“git commit”调用,不带任何参数。钩子应该

# 发出适当的消息后以非零状态退出if

# 它想要停止提交。

#

# 要启用此挂钩,请将此文件重命名为“预提交”。

如果git rev-parse --verify HEAD /dev/null 21

然后

反对=头

别的

# 针对空树对象的初始commit: diff

针对=4b825dc642cb6eb9a060e54bf8d69288fbee4904

SCRIPT_DIR=$(目录名"$0")

SCRIPT_ABS_PATH=`cd "$SCRIPT_DIR";密码`

$SCRIPT_ABS_PATH/././gradlew -PcheckCommit="true" checkstyle

如果[ $? -eq 0];然后

echo "检查样式确定"

别的

退出[[ $ERROR_INFO=~ "checkstyle" ]] 退出1

# 如果您想允许非ASCII 文件名,请将此变量设置为true。

allownonascii=$(git config --bool hooks.allownonascii)

# 将输出重定向到stderr。

执行12

# 跨平台项目

s tend to avoid non-ASCII filenames; prevent # them from being added to the repository. We exploit the fact that the # printable range starts at the space character and ends with tilde. if [ "$allownonascii" != "true" ] && # Note that the use of brackets around a tr range is ok here, (it"s # even required, for portability to Solaris 10"s /usr/bin/tr), since # the square bracket bytes happen to fall in the designated range. test $(git diff --cached --name-only --diff-filter=A -z $against | LC_ALL=C tr -d "[ -~]" | wc -c) != 0 then cat<好了,文章到此结束,希望可以帮助到大家。

用户评论

陌離

这篇文章真是太棒了!终于能摆脱每次手动检查提交日志和代码格式烦恼了。

    有10位网友表示赞同!

别在我面前犯贱

我一直在想怎么实现这种自动检查功能,想不到可以用Gradle和Git Hooks一起完成,效率太高了。

    有20位网友表示赞同!

该用户已上天

学习一下Android Studio项目使用 Gradle 和 Git Hooks 进行提交检查,应该能提高开发工作效率。

    有13位网友表示赞同!

来瓶年的冰泉

对代码的 CheckStyle 检查非常重要,这篇文章能帮助我保证代码风格的一致性。

    有15位网友表示赞同!

权诈

Git Hooks 的应用太棒了,可以定制各种自动化任务,这个实践很有用的启发。

    有12位网友表示赞同!

绳情

我已经在其他项目中使用 Git Hooks 了,这次学习 Android Studio 中的用法应该能帮助我更好地运用它。

    有20位网友表示赞同!

苏樱凉

提交日志格式很重要,这样可以让代码审查更方便,这篇文章帮我找到了一个高效的工具。

    有14位网友表示赞同!

信仰

期待了解更多关于 Gradle 和 Git Hooks 的应用案例,这两种技术真的太牛了!

    有5位网友表示赞同!

爱你心口难开

我经常会犯提交日志写错的错误,这个功能能帮到我不少啊。

    有8位网友表示赞同!

我绝版了i

Android 项目中使用这些工具可以很大程度上提高开发质量和效率,值得学习一下。

    有6位网友表示赞同!

追忆思域。

我想知道这篇文章会详细讲解如何配置 Gradle 和 Git Hooks 的具体步骤吗?

    有6位网友表示赞同!

孤岛晴空

我对代码风格检查也比较重视,这个 CheckStyle 检查功能让我很感兴趣。

    有10位网友表示赞同!

病态的妖孽

希望这篇文章能够提供更具体的示例,方便我更好地理解和应用这些技术。

    有5位网友表示赞同!

有阳光还感觉冷

学习新的开发工具总是很有挑战性,但成果也是非常明显的。

    有18位网友表示赞同!

顶个蘑菇闯天下i

这种自动化检查功能可以节省很多时间,提高工作效率。真是个好东西!

    有6位网友表示赞同!

oО清风挽发oО

现在越来越多人开始关注代码质量和开发规范,这篇文章能帮助我更好地实践这些要求。

    有15位网友表示赞同!

念安я

分享这样的经验和技巧总是很宝贵,感谢作者的分享!

    有7位网友表示赞同!

良人凉人

我已经记下来要学习 Gradle 和 Git Hooks 的方法了,可以提高我的开发水平。

    有10位网友表示赞同!

【使用Gradle和Git Hooks优化Android Studio项目提交流程】相关文章:

1.蛤蟆讨媳妇【哈尼族民间故事】

2.米颠拜石

3.王羲之临池学书

4.清代敢于创新的“浓墨宰相”——刘墉

5.“巧取豪夺”的由来--米芾逸事

6.荒唐洁癖 惜砚如身(米芾逸事)

7.拜石为兄--米芾逸事

8.郑板桥轶事十则

9.王献之被公主抢亲后的悲惨人生

10.史上真实张三丰:在棺材中竟神奇复活