由spacecommander这个库所想到的自动化管理
由spacecommander这个库所想到的
我最近两个周都在做持续化集成和代码风格管理的东西.
我会分两篇博客来讨论一下这两个东西.这一篇先讲讲代码风格管理.
工具化程度是衡量一个公司技术水准很重要的一个考量.例如跑Unit Test,代码风格检测,持续化集成都自动化的时候,这些东西都是可以极大的节省时间精力的东西.而且这些东西其实并没有想象中难.好好研究一下,两三天就能搭个能用的出来.
Camera360和英语流利说都是这方面做的很好的公司.
Camera360的持续化集成做的非常强大.比如通过github的webhooks通知自己的服务端打包,然后还有自己做的类似于TestFlight的app.
流利说用Facebook的phabricator做code review和task manager.还有自己搭建的gitlab做cocoapods的podspec.
在这样的环境开发是很舒服的.你们有时间可以去这两家公司体验一下.
今天主要讲一个库,spacecommander.这个主要是利用clang来进行自动格式化代码.
首先git clone git@github.com:square/spacecommander.git
到你的本地.
比如说我的spacecommander是放到/Users/zangqilong/Projects/spacecommander
这个目录下.
记住这个目录,等下我们需要运行这个目录里的脚本文件.
打开你的某个项目的根目录.例如,我拿我写的美团Demo为例.
/Users/zangqilong/Projects/MeituanDemo
然后运行~/Projects/spacecommander/setup-repo.sh
.
这样,我们的项目就安装了我们的代码检测工具.

这个命令主要干了这么两件事.一个是添加了.clang-format
文件.
如图

这个文件主要是做什么的呢?
这个文件主要是设定了代码的一些风格.

比如,是否允许if后面如果是短表达式的时候是否允许不换行.
还有定义变量的风格.
比如AlignConsecutiveAssignments这个选项.如果设为true
int aaaa = 12;
int b = 23;
int ccc = 23;
声明的变量就是这种风格.
AlignConsecutiveDeclarations这个选项设为true呢.
就是这种风格.
int aaaa = 12;
float b = 23;
std::string ccc = 23;
类似于这样的选项有几十种.具体的内容可以参看这里.clang format style
所以,功能是非常强大的.
安装了spacecommander到我们的目录之后,他还会帮助我们写一个hook.中文叫做钩子.这东西放在哪里呢?
这个东西放在/Users/zangqilong/Projects/MeituanDemo/.git/hooks
这里.
如图

注意看哪个叫做
pre-commit
的文件.没有后缀名的那个,凡是带.sample的文件都是示例文件,就是git教你怎么写钩子的文件.你把.sample去掉之后才会生效.
我们使用vim打开.
在看代码之前,我先告诉大家这个pre-commit到底是干嘛的.很简单,这个东西就是在你每次要commit代码之前,git都会去找,有没有这个文件.如果有这个文件,那么就去文件里执行一些特定的shell脚本.
综上所述,当你运行git commit -m "xxxx"
的时候,他就去执行脚本.就这么简单.
然后呢,这个脚本是这样的.

脚本很简单,就是每次commit的时候跑去本地的spacecommander文件夹里运行一个叫做format-objc-hook
的文件.
那么我现在直接告诉大家这个文件是干嘛的.
你每次commit的时候,这个format-objc-hook就去找你的哪些文件是修改过的,需要commit那么他就去运行format-objc-file.sh 文件名
这个脚本去检测你的代码是否符合规范.如果规范就让git add 这个文件,如果不通过,那么就打印一段话告诉你哪些文件不符合规范.
如图.

我在.clang-format文件里禁止了if后面接短表达式.
所以这种语句是不符合规范的.那么我们现在提交一下.

看它检测到GroupPurchaseViewController.m这个文件里有不符合规范的语句.提示你运行脚本纠正.
那么你可以运行/Users/zangqilong/Projects/spacecommander"/format-objc-files.sh Meituan/GroupPurchaseViewController.m
来纠正.
结果现在有一个问题很讨厌,就是每次运行脚本的时候都得输入一大串命令,我们其实可以设置一个alias,来把这个命令简化.
那么如果你是用的是bash,需要修改~/.bash_profile
,我用的是zsh,所以需要修改~/.zshrc
这个文件.
如图

添加
alias fmtone="~/Projects/spacecommander/format-objc-file.sh"
alias fmtall="~/Projects/spacecommander/format-objc-files-in-repo.sh"
以后你运行fmtone + 文件名就可以纠正单个文件的风格.那么
运行fmtall呢,就可以纠正所有文件的风格.
我们来试一试.

好了,我们纠正了所有代码的风格.
有人可能会问,万一我的iOS项目里使用了Pods和carthage怎么办?它会不会把我的第三方库也全部整理一遍.
这个是不会的,人家已经都想好了.不信
你去看你的spacecommander的lib/common-lib.sh这个文件.

echo "common_sh $files" | grep -v 'Pods/' | grep -v 'Carthage/' >&1
这句话就是利用正则把含有pods和carthage的文件路径去掉了.
下篇讲一下如何在服务端跑Unit Test.