Xcode工程文件pbxproj
Xcode會去讀Project.pbxproj文件,把pbxproj轉成plist文件,看起根目錄結構
html
rootObject:指向的是咱們的工程對象。(對應一個24個16進制字符,96位的UUID,具體生成規則沒有確切文檔說明,Xcodeproj使用的是 日期+進程ID+MAC地址組合成一個惟一ID,任何一個文件都對應一個uuid,而且必定屬於某個組內,工程根目錄所在組爲mainGroup)git
- objects:
工程中的全部配置都在這裏
- archiveVersion:打包版本???
- objectVersion:Xcode兼容的版本???例如 Xcode 9.3以上兼容???官方沒有具體說,參考 XcodeCompatibilityVersion枚舉值。
- classes:空字段暫時不知道含義
Xcode解讀工程樹形結構
-
Xcode讀取rootObject值,找到工程uuid。並在
objects對象
中尋找rootObject對象。github -
rootObject的isa類型是PBXProject類型,表示是工程對象,咱們看看工程對象的包含了哪些東西xcode
- attributes 屬性,包含一些編譯器的基本信息,版本,以及項目中的target,每個target一個UUID其中,Xcode自動建立的項目裏面有三個target一個就是所要編譯的APP主target,其他兩個爲test Target,能夠看到其他兩個target中有一個字段TestTargetID指向主target,能夠理解爲依賴相關吧
- buildConfigurationList 配置列表 指向一個配置字典 XCConfigurationList 類型類型
- compatibilityVersion (兼容版本 目前看來是 Xcode 3.2)
- developmentRegion 語言版本,English英語
- hasScannedForEncodings 是否已經掃描了文件編碼信息
- knownRegions 不一樣區域的本地資源文件列表
mainGroup Xcode的文件組織形式,能夠理解爲文件層次 PBXGroup 類型
- productRefGroup 編譯後的輸出文件 PBXGroup 類型
- projectDirPath 項目路徑
- projectRoot 項目的根目錄
- targets 項目下的N個target對象 PBXNativeTarget類型
-
根據mainGroup的uuid找到對應的對象,Xcode打開工程對比配置ruby
-
根據children中的uuid又能夠找到對應的組對象,組對象又會包含其餘的對象,造成樹形結構網站
objects中包含的集合對象
-
PBXProject (工程包含全部信息)ui
-
PBXNativeTarget section(點擊工程project那一欄)編碼
-
XCBuildConfiguration (沒錯 這個就是咱們常常看見的build Setting選項卡的內容 對應各個target的 buildSetting)spa
-
XCConfigurationList(Xcode編譯模式,指向多個XCBuildConfiguration).net
-
PBXTargetDependency
-
PBXBuildFile 工程構建所須要的源文件,依賴庫,資源文件
-
PBXBuildPhase 就是Xcode中Build Phases選項卡
-
PBXContainerItemProxy
-
PBXFileElement(抽象類型,包含文件類型,組類型)
-
PBXTarget (編譯目標對象)
Xcodeproj修改工程配置
Group的概念
-
group並不必定要是真實文件夾,只是Xcode用於管理文件歸類的集合。也能夠是真實的文件夾,咱們分別建立1個虛擬組和1個真實文件夾組,看看proj文件的變化。咱們發現虛擬組的group對象是沒有path值的 ,真實文件夾group對象有指定path和sourceTree 來指向文件夾「實際路徑」
-
文件也有sourceTree和path兩個屬性用來指定實際文件路徑。
-
給一個實體group添加文件Demo
-
給一個虛擬group添加文件Demo
添加庫到target
-
添加系統庫依賴 見Demo
-
添加三方庫依賴 見Demo
修改Build Setting 設置
編譯依賴配置分爲工程配置和目標對象配置。
-
修改目標依賴,見Demo
-
修改工程依賴,見Demo
整個pbxproj文件結構圖
XcodeProj腳本demo
https://github.com/xiongwj0910/testXcodeProj/tree/master
腳本功能目錄
添加文件到虛擬group腳本--addFileToInventedGroup.rb
添加文件到有實體文件夾的group腳本--addFileToGroup.rb
添加系統庫給target腳本--addFrameWorkToTarget.rb
添加三方庫給target腳本--addThirdFrameWorkToTarget.rb
進入到工程根目錄,在執行對應功能的腳本
cd /xxx/xxx/testXcodeProj ruby ./Script/addThirdFrameWorkToTarget.rb
3.參考網站
project.pbxproj結構參考 https://yulingtianxia.com/blog/2016/09/28/Let-s-Talk-About-project-pbxproj/
https://www.jianshu.com/p/e82ec6a56fc2(Xcode工程文件project.pbxproj小結)
官網結構文檔 http://www.monobjc.net/xcode-project-file-format.html
https://www.jianshu.com/p/bd4e3c1a7276#(xcode工程文件格式說明 翻譯官網)
https://blog.csdn.net/darya_1/article/details/78095821(xcodeproj使用心得)
Xcodeproj源碼詳解
https://www.jianshu.com/p/84936d9344ff(cocoapods作了什麼 )
https://www.jianshu.com/p/98029cf49a69(Xcodeproj: 使用 ruby 自由的修改Xcode 工程文件)
https://blog.csdn.net/skylin19840101/article/details/64905318(各語言版本的解析庫)
Xcodeproj使用參考網站 https://www.jianshu.com/p/98029cf49a69
https://blog.csdn.net/darya_1/article/details/78095821
https://www.jianshu.com/p/03a3f7eafe26