对iOS开发有用的一些自动化处理脚本



最近编写了两个辅助iOS开发的脚本,用于一些自动化处理。



# 简介

##

## objective-c 方法名格式化器

由于工作有些变动的原因,之前一段时间开发iOS时是在21寸的iMac屏幕上开发,现在自己买了macbook pro之后就在自己的笔记本上开发(其实之前更早的时候我是在19寸的黑苹果显示器下开发)。这样的屏幕尺寸变化,导致一些基于原来屏幕尺寸的代码缩进、换行在另一个屏幕上看起来显得异常混乱。

了解obj-c语法的人都知道,它的方法定义语法导致了它有时看起来比其他语言的方法签名要长得多。这样在那种13寸的笔记本上,看起来总是很别扭(虽然它支持了方法定义可以换行,但在xcode创建一个文件时,它对于包含多个参数的那些默认方法名称也是不换行的)。使用xcode默认的代码格式化器貌似也没有对方法的参数换行(就算有,对于已经存在的项目这种历史遗留问题,一个文件一个文件去手动执行格式化命令,也怪累人的)

于是,我写了个脚本,专门用来做这件事。

它根据配置的项目路径:
#TODO: change the path to your xcode project path
GLOBAL_PROJECT_PATH = ‘/Users/yanghua/Desktop/weiboDemo’

去匹配特定后缀的文件类型:
#want to match
GLOBAL_INCLUDE = [‘.h’, ‘.m’]

当然,为了小心起见你或许不想动那些你从外部引入的库文件,这里也对此进行了支持(你只需把需要排除的文件夹相对路径或文件的相对路径填写进去即可):
#want to exclude
GLOBAL_EXCLUDE = []

然后,它就会遍历所有匹配到的文件,打开它们,再遍历所有的行,使用正则来匹配方法签名

注:这里的正则表达式,是自己根据obj-c语法写的。用此脚本格式化了两个项目后,再进行编译没有发现语法错误。本人正则小白,如果有更好的写法,请不吝赐教!
#match method pattern
#\s :space
#\s :0 or n space
#([\d\w]
) :0 or n number or char such as (void) / ( CGFloat)
#(([\d\w])\s*\s): such as: (NSString ) / ( UITableViewController )
#( :match left ‘(‘
#) :match right ‘)’
GLOBAL_METHOD_PATTERN = ‘^\s(-|+)\s(\s(([\d\w])\s**\s)\s)\s

#match notation and postil
GLOBAL_UNUSED_PATTERN = ‘^\s(//|//)\s

几点说明:

(1)匹配所有方法名

(2)如果方法没有或只有一个参数则不进行处理

(3)如果方法多于一个参数,从第二个参数开始,任何参数的标签,如果比方法名第一段字符个数多,也不进行处理(因为这样这行,无法基于冒号对齐)

(4)对于被注释的方法名,不进行任何处理

(5)对于方法调用暂时没有进行处理(太复杂了)

(6)其他的方法签名都会被匹配折行处理

效果举例:
-(CGFloat) getHeightWithText:(NSString)text fontSize:(CGFloat)fontSize constraint:(CGSize)cSize minHeight:(CGFloat)mHeight;

to:
-(CGFloat) getHeightWithText:(NSString*)text
fontSize:(CGFloat)fontSize
constraint:(CGSize)cSize
minHeight:(CGFloat)mHeight;


##

## svn missing-file 警告处理器

最近在写一个项目,虽然iOS端只有本人一个。但还是尝试Xcode自带的“Source Control”功能,并采用了SVN来作为版本控制。用的还行(因为也只是一个人在Check in/out),但还是遇到了些问题。
Bug产生过程:
1. Project处于svn版本控制之下
2. (可有可无)向Project中添加文件,并加入版本控制(A)
3. 从项目中Delete某个文件,并选择Move to trash
4. 编译的时候会有Wraning提示缺少了之前删除的那个文件(Missing File xxxx)
另外,一个文件以处于版本控制下,修改文件名,也会产生Missing File Warning
具体情况以及处理方式,可参考这篇文章
对于这个问题,参考它的解决方案,我同样写了个脚本来处理它,这个没什么好说的,就是采用了svn的命令行命令。
正常SVN操作策略下:如果产生了上面的问题,在Terminal下,进入项目路径,运行“svn status” 会看到“Missing”的那些file 前面会有个“?”。(注意,不只是这种情况才会产生?,所以我说在正常的SVN操作下,因为特殊情况无法控制)。脚本匹配到带有?号开头的行,但其中不包含项目文件——.xcodeproj。找到它然后进行删除!

运行


命令行运行

./Users/yanghua/Desktop/Python/objcFileHandler/objcMethodFormatter.py

Xcode 内置 per/post-action 运行【推荐】

第一步:


第二步:


你可以对左边这些Scheme做任意的配置,他们实现了类似“AOP”思想的拦截。使得你可以在某个动作的前后增加前置(Pre-actions)和后置(post-actions)加以干涉。点击“+”选择创建运行脚本。

第三步:


选择Target, 然后键入需要运行的脚本路径。这样每次你执行特定的Scheme(比如这里的Build),它就会执行一次,并且就算脚本有问题,也不会影响主要动作(Build)。
个人认为,Xcode提供这种功能真心非常不错。

写在最后

这两个脚本的源码,都提交到本人的GitHub上去了。有需要的可以自行取用。
另外如果你有不错的idea,欢迎提供,欢迎拍砖!



版权声明:本文为博主原创文章,未经博主允许不得转载。