批量修改OC类名脚本 -- python

前言

近日由于种种原因,需要把代码里面的类全部都修改一遍类名。

在网上找了一圈相关的开源库,没有发现有合适满意的,始终都存在一些问题,要么出现误修改,要么把方法名或者属性名也给修改了等等情况。

于是决定掏出生疏的Python来写一个。

批量修改类名需要解决四个问题:

    1. 如何取得需要修改的类名?
    1. 如何修改文件中出现的类名并且不会出现误改等情况?
    1. 如何修改文件名?
    1. 修改文件名后,如何同步修改project.pbxproj里面的文件名信息?

问题一、如何取得需要修改的类名?

想法A:

由于自己前不久写了一个获取target对应的编译以及资源文件的工具MacPbxprojHelper,利用其来获取到target对应的类名写入文件,然后用python来读取文件获取到需要修改的类名,实时上第一版我也是这么做的,但是不够优雅,明明一个脚本能解决的事,为什么需要那么多步操作呢?

想法B:

利用python直接遍历文件夹获取类名,没错就决定是你了。
其实用python遍历文件实现起来特别简单快捷。但是其中也有可能存在的问题,例如我们的项目中包含有部分资源文件,而资源文件的后缀名是不定的,但是实际我们只需要.m以及.mm结尾的文件前缀作为我们的类名,当然其中包含有类目也需要过滤掉。并且考虑到我们具备一些特殊的需求,需要过滤某些文件甚至某些文件夹下的文件等等。我这边的脚本都有考虑到

实现代码如下:

def getClassNames(filepath):
    #读取文件名入数组
    #过滤文件夹
    filterDirs = ["ThirdKit/","小说/"]
    #过滤文件
    filterFiles = []
    classNames = []
    #遍历filepath下所有文件,包括子目录
    for root, dirs, files in os.walk(filepath):
        for name in files:
            path = os.path.join(root, name)
            #过滤文件夹
            isFilterDir = 0
            for filterDir in filterDirs:
                if filterDir in path:
                    isFilterDir = 1
                    break
            if isFilterDir != 1:
                if ".m" in name:
                    splitNames = name.split(".m")
                    #只选择.m和.mm结尾的文件
                    if splitNames[1] == "" or splitNames[1] == "m":
                        cn = splitNames[0]
                        #过滤文件
                        isFilterFile = 0
                        for ff in filterFiles:
                            if ff == cn:
                                isFilterFile = 1
                        if isFilterFile != 1:
                            #过滤类目
                            if cn.find("+") == -1:
                                print(cn)
                                classNames.append(cn)
    return classNames

问题二、如何修改文件中出现的类名并且不出现误改的情况?

在我搜集到的开源的脚本中,有极大比例的一部分是直接通过类名替换,其实这特别容易出现误改。比如我有一个类名为ABC,一个类名为AB,那么ABC就可能出现被修改两次的情况。所以我这边就采用笨办法,先敲定类名出现的场景,根据其场景设定规则,只有出现类名出现在这些规则中时,才去替换,这样就可以保证100%的正确率。(这也是大坑,因为不同的程序员书写习惯的问题,导致规则的定义实际极度繁琐,而且会出现部分遗漏,每一次遗漏后,我都需要添加规则再重跑来验证··)

下面就是这个脚本最大的贡献·· 自认为基本涵盖完了类名的出现场景(如果有没有涵盖的,请记得一定联系我!!),一共37种规则,运用这37种规则,做到了一次脚本,既完美修改,无需在动代码就可以直接运行并且不会有闪退问题··

#一开始构思了 14个 后来....
    rule_1 = '"' + cn + '.' #引用修改
    rule_2 = '"' + cn + '"' #类名被直接使用
    rule_3 = ':' + cn + ' ' #继承 后续有空格
    rule_4 = ':' + cn + '\n' #类名后面是换行
    rule_5 = ' ' + cn + '<'
    rule_6 = ' ' + cn + '\n' #类名后面是换行
    rule_7 = ' ' + cn + ' '
    rule_8 = ' ' + cn + '('
    rule_9 = '[' + cn + ' '
    rule_10 = '[' + cn + '*'
    rule_11 = '(' + cn + '*'
    rule_12 = ')' + cn + '*'
    rule_13 = ' ' + cn + '*'
    rule_14 = ' ' + cn + '\n'
    rule_15 = '(' + cn + ' '
    rule_16 = ' ' + cn + ';'
    rule_17 = ',' + cn + ' '
    rule_18 = ',' + cn + '*'
    rule_19 = ')' + cn + ' ' 
    rule_20 = ',' + cn + ';'
    rule_21 = ' ' + cn + ','
    rule_22 = '<' + cn + '*' #被当做协议 遵守类
    rule_23 = '<' + cn + ' '
    rule_24 = ',' + cn + ','
    rule_25 = ' ' + cn + ':'
    rule_26 = ':' + cn + '//' #后面跟注释的、、我TM。。
    rule_27 = ' ' + cn + '//' 
    rule_28 = ' ' + cn + '{' #后面跟大括号的··
    rule_29 = ')' + cn + '<' #为什么遵守协议 也用了 实际类名 没有用ID
    rule_30 = '(' + cn + '.' #为什么类要使用.语法
    rule_31 = ' ' + cn + '.'  #类名调用.语法
    rule_32 = '!' + cn + '.'  
    rule_33 = ':' + cn + '.'  #类名调用点语法 被当做参数传入
    rule_34 = '[' + cn + '\n' #类名被换行
    rule_35 = ':' + cn + '<' #继承类名后面 直接接入协议 默认实际是不存在这个问题的
    rule_36 = '"' + cn + '_' #类取名有下划线以及数字 以及通过工厂用数字来创建的情况
    rule_37 = '"' + cn + '%' #类取名有数字 以及通过工厂用数字来创建的情况

问题三、如何修改文件名?

这个问题其实很好解决,利用python的os库就可以直接rename,只是需要拼接全路径。并且在给类文件重命名的时,需要注意前缀和后缀添加的位置,不要添加到.h和.m后面去了即可。

问题四、如何同步修改project.pbxproj里面的文件信息?

这里又和第二个问题一样需要定义一定规则,才能确保不会出现误替换,但是这个规则和上面比起来简直是小巫见大巫。规则如下:

def pbRule(cn):
    rule_1 = '=' + cn + "."
    rule_2 = ' ' + cn + "."
    rule_3 = '/' + cn + "."
    rule_4 = '"' + cn + "."

以上,问题都解决了。

使用方式

----------脚本说明----------
脚本用于批量修改类名
脚本可传入四个参数
1、待处理的文件路径. example-->'./KanManHua'
2、待修改的pbxproj文件地址 example--        >'./KanManHua.xcodeproj/project.pbxproj'
3、类名前缀 example-->'MHT_'
4、类名后缀 example-->'_MHT'

其中前三个参数为必传参数 划重点,要考
----------请开心使用---------
另脚本支持 -h --help 操作

当参数错误时,也有对应提示以及上述帮助信息

正常使用

示例:

python changeClassName.py ./KanManHua ./KanManHua.xcodeproj/project.pbxproj MHT_ _MHT
helpinfo获取

示例:

python changeClassName.py
python changeClassName.py -h
python changeClassName.py --help

脚本地址

后记

由于我司还有需求修改指定 target的类名,实际也有一套可以仅仅只修改target类名的方法,但是由于使用要复杂一点,首先要提取target对应的编译类,再使用脚本来修改,修改使用到我之前发布的一个工具类MacPbxprojHelper,如有需要的话请和我联系。
联系方式:357863248@qq.com

MacPbxprojHelper介绍链接

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容

  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,688评论 0 10
  • Python 面向对象Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对...
    顺毛阅读 4,203评论 4 16
  • 〇、前言 本文共108张图,流量党请慎重! 历时1个半月,我把自己学习Python基础知识的框架详细梳理了一遍。 ...
    Raxxie阅读 18,892评论 17 410
  • 绘爱正面管教阅读 629评论 0 0
  • 今后的日子,我的头发越来越少,我写给你的句子越来越少,我剩下的时间越来越少,但世界永恒,星辰常在,苍穹不老。最后的...
    JKCP阅读 5,498评论 7 11