摘要:前言近日由于種種原因,需要把代碼里面的類全部都修改一遍類名。并且在給類文件重命名的時(shí),需要注意前綴和后綴添加的位置,不要添加到和后面去了即可。
前言
近日由于種種原因,需要把代碼里面的類全部都修改一遍類名。
在網(wǎng)上找了一圈相關(guān)的開源庫(kù),沒有發(fā)現(xiàn)有合適滿意的,始終都存在一些問題,要么出現(xiàn)誤修改,要么把方法名或者屬性名也給修改了等等情況。
于是決定掏出生疏的Python來寫一個(gè)。
批量修改類名需要解決四個(gè)問題:
如何取得需要修改的類名?
如何修改文件中出現(xiàn)的類名并且不會(huì)出現(xiàn)誤改等情況?
如何修改文件名?
修改文件名后,如何同步修改project.pbxproj里面的文件名信息?
問題一、如何取得需要修改的類名?由于自己前不久寫了一個(gè)獲取target對(duì)應(yīng)的編譯以及資源文件的工具M(jìn)acPbxprojHelper,利用其來獲取到target對(duì)應(yīng)的類名寫入文件,然后用python來讀取文件獲取到需要修改的類名,實(shí)時(shí)上第一版我也是這么做的,但是不夠優(yōu)雅,明明一個(gè)腳本能解決的事,為什么需要那么多步操作呢?
利用python直接遍歷文件夾獲取類名,沒錯(cuò)就決定是你了。
其實(shí)用python遍歷文件實(shí)現(xiàn)起來特別簡(jiǎn)單快捷。但是其中也有可能存在的問題,例如我們的項(xiàng)目中包含有部分資源文件,而資源文件的后綴名是不定的,但是實(shí)際我們只需要.m以及.mm結(jié)尾的文件前綴作為我們的類名,當(dāng)然其中包含有類目也需要過濾掉。并且考慮到我們具備一些特殊的需求,需要過濾某些文件甚至某些文件夾下的文件等等。我這邊的腳本都有考慮到
實(shí)現(xiàn)代碼如下:
def getClassNames(filepath): #讀取文件名入數(shù)組 #過濾文件夾 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結(jié)尾的文件 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問題二、如何修改文件中出現(xiàn)的類名并且不出現(xiàn)誤改的情況?
在我搜集到的開源的腳本中,有極大比例的一部分是直接通過類名替換,其實(shí)這特別容易出現(xiàn)誤改。比如我有一個(gè)類名為ABC,一個(gè)類名為AB,那么ABC就可能出現(xiàn)被修改兩次的情況。所以我這邊就采用笨辦法,先敲定類名出現(xiàn)的場(chǎng)景,根據(jù)其場(chǎng)景設(shè)定規(guī)則,只有出現(xiàn)類名出現(xiàn)在這些規(guī)則中時(shí),才去替換,這樣就可以保證100%的正確率。(這也是大坑,因?yàn)椴煌某绦騿T書寫習(xí)慣的問題,導(dǎo)致規(guī)則的定義實(shí)際極度繁瑣,而且會(huì)出現(xiàn)部分遺漏,每一次遺漏后,我都需要添加規(guī)則再重跑來驗(yàn)證··)
下面就是這個(gè)腳本最大的貢獻(xiàn)·· 自認(rèn)為基本涵蓋完了類名的出現(xiàn)場(chǎng)景(如果有沒有涵蓋的,請(qǐng)記得一定聯(lián)系我!!),一共37種規(guī)則,運(yùn)用這37種規(guī)則,做到了一次腳本,既完美修改,無需在動(dòng)代碼就可以直接運(yùn)行并且不會(huì)有閃退問題··
#一開始構(gòu)思了 14個(gè) 后來.... rule_1 = """ + cn + "." #引用修改 rule_2 = """ + cn + """ #類名被直接使用 rule_3 = ":" + cn + " " #繼承 后續(xù)有空格 rule_4 = ":" + cn + " " #類名后面是換行 rule_5 = " " + cn + "<" rule_6 = " " + cn + " " #類名后面是換行 rule_7 = " " + cn + " " rule_8 = " " + cn + "(" rule_9 = "[" + cn + " " rule_10 = "[" + cn + "*" rule_11 = "(" + cn + "*" rule_12 = ")" + cn + "*" rule_13 = " " + cn + "*" rule_14 = " " + cn + " " rule_15 = "(" + cn + " " rule_16 = " " + cn + ";" rule_17 = "," + cn + " " rule_18 = "," + cn + "*" rule_19 = ")" + cn + " " rule_20 = "," + cn + ";" rule_21 = " " + cn + "," rule_22 = "<" + cn + "*" #被當(dāng)做協(xié)議 遵守類 rule_23 = "<" + cn + " " rule_24 = "," + cn + "," rule_25 = " " + cn + ":" rule_26 = ":" + cn + "http://" #后面跟注釋的、、我TM。。 rule_27 = " " + cn + "http://" rule_28 = " " + cn + "{" #后面跟大括號(hào)的·· rule_29 = ")" + cn + "<" #為什么遵守協(xié)議 也用了 實(shí)際類名 沒有用ID rule_30 = "(" + cn + "." #為什么類要使用.語(yǔ)法 rule_31 = " " + cn + "." #類名調(diào)用.語(yǔ)法 rule_32 = "!" + cn + "." rule_33 = ":" + cn + "." #類名調(diào)用點(diǎn)語(yǔ)法 被當(dāng)做參數(shù)傳入 rule_34 = "[" + cn + " " #類名被換行 rule_35 = ":" + cn + "<" #繼承類名后面 直接接入?yún)f(xié)議 默認(rèn)實(shí)際是不存在這個(gè)問題的 rule_36 = """ + cn + "_" #類取名有下劃線以及數(shù)字 以及通過工廠用數(shù)字來創(chuàng)建的情況 rule_37 = """ + cn + "%" #類取名有數(shù)字 以及通過工廠用數(shù)字來創(chuàng)建的情況問題三、如何修改文件名?
這個(gè)問題其實(shí)很好解決,利用python的os庫(kù)就可以直接rename,只是需要拼接全路徑。并且在給類文件重命名的時(shí),需要注意前綴和后綴添加的位置,不要添加到.h和.m后面去了即可。
問題四、如何同步修改project.pbxproj里面的文件信息?這里又和第二個(gè)問題一樣需要定義一定規(guī)則,才能確保不會(huì)出現(xiàn)誤替換,但是這個(gè)規(guī)則和上面比起來簡(jiǎn)直是小巫見大巫。規(guī)則如下:
def pbRule(cn): rule_1 = "=" + cn + "." rule_2 = " " + cn + "." rule_3 = "/" + cn + "." rule_4 = """ + cn + "."
以上,問題都解決了。使用方式
----------腳本說明---------- 腳本用于批量修改類名 腳本可傳入四個(gè)參數(shù) 1、待處理的文件路徑. example-->"./KanManHua" 2、待修改的pbxproj文件地址 example-- >"./KanManHua.xcodeproj/project.pbxproj" 3、類名前綴 example-->"MHT_" 4、類名后綴 example-->"_MHT" 其中前三個(gè)參數(shù)為必傳參數(shù) 劃重點(diǎn),要考 ----------請(qǐng)開心使用--------- 另腳本支持 -h --help 操作
當(dāng)參數(shù)錯(cuò)誤時(shí),也有對(duì)應(yīng)提示以及上述幫助信息
示例:
python changeClassName.py ./KanManHua ./KanManHua.xcodeproj/project.pbxproj MHT_ _MHT
示例:
python changeClassName.py python changeClassName.py -h python changeClassName.py --help腳本地址 后記
由于我司還有需求修改指定 target的類名,實(shí)際也有一套可以僅僅只修改target類名的方法,但是由于使用要復(fù)雜一點(diǎn),首先要提取target對(duì)應(yīng)的編譯類,再使用腳本來修改,修改使用到我之前發(fā)布的一個(gè)工具類MacPbxprojHelper,如有需要的話請(qǐng)和我聯(lián)系。
聯(lián)系方式:357863248@qq.com
MacPbxprojHelper介紹鏈接
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/42859.html
摘要:語(yǔ)法命令基本語(yǔ)法實(shí)例數(shù)據(jù)類型支持五種數(shù)據(jù)類型字符串,哈希,列表,集合及有序集合。資源修改文件增加如下內(nèi)容如果在集成環(huán)境的目錄下安裝完成后重啟或。 Redis 簡(jiǎn)介 Redis 是完全開源免費(fèi)的,遵守BSD協(xié)議,是一個(gè)高性能的key-value數(shù)據(jù)庫(kù)。Redis 與其他 key - value 緩存產(chǎn)品有以下三個(gè)特點(diǎn): Redis支持?jǐn)?shù)據(jù)的持久化,可以將內(nèi)存中的數(shù)據(jù)保持在磁盤中,重啟的...
閱讀 984·2021-11-24 09:39
閱讀 2185·2021-11-16 11:54
閱讀 2077·2021-11-11 17:22
閱讀 2372·2021-09-30 09:55
閱讀 3591·2021-08-12 13:22
閱讀 1626·2019-08-30 15:44
閱讀 1168·2019-08-29 12:12
閱讀 3263·2019-08-27 10:58