根據(jù)項目需求章贞,同一個工程可能需要多個target冰悠,target之間只有細(xì)微的不同节槐,這時候使用target比多個project要方便的多。
最近項目用到了多target锯仪,但是碰到一個奇怪的問題泵督,某一個target的編譯文件經(jīng)常會莫名其妙的重復(fù)變多或者缺少某個文件的引用,例如我項目中有兩個target:app一號庶喜,app二號:
選擇targets名稱->Build Phases->Compile Source
查看小腊,此時app一號的Compile Sources
數(shù)量為3:
此時app二號的Compile Sources
數(shù)量為5
這只是個demo完全可以手動點擊查看一下app一號缺少什么文件救鲤,真實項目中有成百上千Compile Sources
手動對比幾乎不可能,并且有時候缺少某個文件編譯還不報錯溢豆,直到運行的時候才會出現(xiàn)crash蜒简,可能是因為xcode有緩存。但是為了項目更加安全并且減少手動工作量漩仙,是不是可以添加編譯前執(zhí)行的腳本搓茬,通過腳本分別讀取每個target的Compile Sources
然后對比,打印出某個target特有的Compile Sources
,這樣方便檢查添加队他。
打印結(jié)果如圖:
腳本分析了每個target特有的Compile Sources
和framework
做法:
-
首先設(shè)置編譯前自動運行腳本入口
打開項目配置卷仑,選擇Build Phases
這樣就可以創(chuàng)建一個新Script Phase,然后在黑色區(qū)域?qū)懭肽愕哪_本
這樣就可以創(chuàng)建一個新Script Phase麸折,然后在黑色區(qū)域?qū)懭肽愕哪_本
在腳本中锡凝,你可以使用一些環(huán)境變量,例如${SRCROOT}
表示項目的根目錄垢啼,${CONFIGURATION}
表示項目的Configuration
,窜锯,更多可以使用的環(huán)境變量可以參考蘋果官方文檔。
當(dāng)編譯的時候就會自動執(zhí)行Script.sh
腳本了芭析,腳本的輸出內(nèi)容可以在Build Log里找到(快捷鍵command + 9
)锚扎,輸出如圖四所示。
以上只是添加了編譯前運行腳本馁启,那么腳本該如何獲取Compile Sources
信息呢驾孔?下面就要了解一下project.pbxproj文件了。
project.pbxproj 文件被包含于 Xcode 工程文件 *.xcodeproj 之中惯疙,存儲著 Xcode 工程的各項配置參數(shù)翠勉。它本質(zhì)上是一種舊風(fēng)格的 Property List 文件,歷史可追溯到 NeXT 的 OpenStep霉颠。由于有Xcode工具的存在对碌,我們一般不需要與pbxproj直接打交道,通過General蒿偎、Build Settungs或者Info等面板俭缓,就可以完成項目工程配置信息的修改。
閱讀Xcode工程文件project.pbxproj小結(jié)
詳細(xì)了解project.pbxproj 文件酥郭。
Compile Sources
信息就存儲在project.pbxproj中华坦,我們可以利用mac提供的property plist文件解析工具 plutil將pbxproj文件轉(zhuǎn)換為json,xml格式等等不从。在Script.sh
腳本中我們轉(zhuǎn)換為json格式惜姐。
plutil -convert json -s -r -o ../compile_tools/pbxproj.json pbxprojTest.xcodeproj/project.pbxproj
-convert
選項可以傳入的參數(shù)有: xml1, binary1 和 json。轉(zhuǎn)換后保存在上一級目錄的compile_tools文件夾中。
然后我們就可以利用python讀取解析json文件歹袁,根據(jù)pbxproj規(guī)則逐步解析獲取Compile Sources
信息坷衍。然后就可以就是多個target的Compile Sources
信息數(shù)組去除交集,找出每個target獨有的条舔,打印出來枫耳。
Script.sh
內(nèi)容如下:
echo "將project.pbxproj轉(zhuǎn)換為json格式"
plutil -convert json -s -r -o ../compile_tools/pbxproj.json pbxprojTest.xcodeproj/project.pbxproj
echo "啟動python虛擬環(huán)境"
source ../compile_tools/venv/bin/activate
echo "執(zhí)行python代碼,分析json文件"
python3 ../compile_tools/tools.py
echo "分析完成"
至于python讀取解析json的代碼孟抗,就是了解pbxproj數(shù)組組織管理規(guī)則之后正常解析json的工作迁杨,自己手動擼一遍吧加深對pbxproj了解!