最近編寫了兩個輔助iOS開發的指令碼,用於一些自動化處理。
簡介objective-c 方法名格式化器
由於工作有些變動的原因,之前一段時間開發iOS時是在21寸的iMac螢幕上開發,現在自己買了macbook pro之後就在自己的筆記本上開發(其實之前更早的時候我是在19寸的黑蘋果顯示器下開發)。這樣的螢幕尺寸變化,導致一些基於原來螢幕尺寸的代碼縮排、換行在另一個螢幕上看起來顯得異常混亂。
瞭解obj-c文法的人都知道,它的方法定義文法導致了它有時看起來比其他語言的方法簽名要長得多。這樣在那種13寸的筆記本上,看起來總是很彆扭(雖然它支援了方法定義可以換行,但在xcode建立一個檔案時,它對於包含多個參數的那些預設方法名稱也是不換行的)。使用xcode預設的代碼格式化器貌似也沒有對方法的參數換行(就算有,對於已經存在的項目這種曆史遺留問題,一個檔案一個檔案去手動執行格式化命令,也怪累人的)
於是,我寫了個指令碼,專門用來做這件事。
它根據配置的項目路徑:
#TODO: change the path to your xcode project pathGLOBAL_PROJECT_PATH = '/Users/yanghua/Desktop/weiboDemo'
去匹配特定尾碼的檔案類型:
#want to match GLOBAL_INCLUDE = ['*.h', '*.m']
當然,為了小心起見你或許不想動那些你從外部引入的庫檔案,這裡也對此進行了支援(你只需把需要排除的檔案夾相對路徑或檔案的相對路徑填寫進去即可):
#want to exclude GLOBAL_EXCLUDE = []
然後,它就會遍曆所有匹配到的檔案,開啟它們,再遍曆所有的行,使用正則來匹配方法簽名
註:這裡的Regex,是自己根據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 postilGLOBAL_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 trash4. 編譯的時候會有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,歡迎提供,歡迎拍磚!https://github.com/yanghua/objc-xcode-Hack-Handlers