通過Xcodeproj深入探究Xcode工程檔案 二
前言
上文介紹了Xcode的配置檔案project.pbxproj
裡面的內容並且提到了Cocoapods正是利用Xcodeproj這個元件實現修改該檔案達到改變Xcode工程結構的效果。本文將著重介紹Xcodeproj
這個元件,通過本文你將會了解這個元件的內容、原理和使用該元件的應用場景。
介紹
Xcodeproj
作為Cocoapods
的元件之一,它能夠允許你用Ruby語言建立或者修改Xcode工程,指令碼化枯燥的管理任務和構造友好的Xcode庫,它同時支援Xcode workspaces (.xcworkspace)
、configuration files (.xcconfig)
和Xcode Scheme files (.xcscheme)
它的API文件在這裡
安裝
Xcodeproj
通過RubyGems
安裝,開啟終端鍵入
$ [sudo] gem install xcodeproj
|
結束後,輸入gem list
檢視Xcodeproj
是否完成安裝,正常情況下你會在list中看到xcodeproj (1.2.0, 1.1.0, 0.28.2)
這一行。
內容
讓我們來大體瞅一眼Xcodeproj
的內容(Class List),如圖1
看到庫裡面的各個類,是不是有點小激動?沒錯,就是上篇文章介紹過的project.pbxproj
裡面的各個元素,連名字都是一樣!單獨看下PBXProject
中的各個Attributes(圖2),再拿上文中project.pbxproj(圖3)
你會發現Xcode配置檔案中元素每個屬性都能在這個庫同名類中找到對應的屬性。值得注意的是,Xcodeproj
中所有的類都繼承於AbstractObject
,這個類是個基類,裡面有isa
,uuid
,project
,其中uuid
就是唯一識別符號,還有其他一些基本的method。這個唯一識別符號的生成過程在uuid_generator.rb
這個類中,筆者水平有限,僅能看出uuid
的生成演算法加入了檔案路徑的MD5
。
實戰
下面你們可以通過下面這三個實戰例子感受下Xcodeproj
的強大,程式碼如下:
|
大家可以寫個ruby指令碼依次將三個例項執行下,注意觀察終端輸出和Xcode目錄結構的變化。
原理
如果你已經執行了上線的操作,那麼一定好奇,這個庫是怎麼操作project.pbxproj
檔案的?首先需要知道的是,在這個庫操作project.pbxproj
之前,需要把Xcode工程的全路徑給它,那我們就從Project
入手,它對應的是上篇文章中提到的根元素,從open
開始,注意我程式碼中的註釋!
|
到了這裡,從根元素進入,分析objects屬性內的所有元素,configure_with_plist
中使用objects的uuid去分析包裝相應元素,將其裝變為庫中的對應類的物件,同時isa
也被複制過去。
最終,project.pbxproj
中的所有元素對應的資訊,都轉化為Ruby物件,然後增刪改查等操作都變為物件操作,使用起來非常方便。
使用場景
- 你可以做一個Ruby指令碼,放在打包測試流程中去,用來分析專案中不同target中缺少的檔案和資源。
- 將一些繁瑣的配置操作寫成一個指令碼,省時省力