使用xcodeproj為工程新增framework

拾雪發表於2017-12-13

最近的需要做一個自動打包各個子模組framework的指令碼。寫指令碼嘛,思路很簡單,把平時那些手動的操作轉化成程式碼就可以。

步驟也很簡單,平時打一個framework的時候需要:

1.在工程 linked Frameworks and Libraries 中新增所需要的framework

2.修改podfile檔案,然後執行pod install 命令

3.執行打包framework的指令碼,輸入子模組名稱做為引數

4.提交程式碼至子模組git倉庫,reset掉中間產生的無用程式碼

想了下這個步驟,唯一有點難度的就是 給工程新增framework,之前做過修改XCode中build Setting的相關設定,感覺應該差不多。但是做的時候問題就出現了,問題來自xcodeproj檔案

簡單介紹下xcodeproj檔案。 

首先這是個類似於ipa的包,顯示包內容或者直接拖到sublime3中開啟,可以看到裡面的結構,其中就有我們今天的主角:project.pbxproj。

project.pbxproj採用的是老式風格的plist檔案(old ASCII plist)。就是由很多 節點{ 內容 } 節點 { 內容 } 組成的,大多數的內容如之前修改build setting的內容,就想當於key-value;找到對應的key之後修改value就可以了,github上有很多的工具。

293EFECE17BB1F2100A264A1 /* Release */ = {

isa = XCBuildConfiguration;

baseConfigurationReference = 5FFFEAC8FAEB3F5B5524ED1D /* Pods.release.xcconfig */;

buildSettings = {

ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;

CLANG_CXX_LANGUAGE_STANDARD = "compiler-default";

CLANG_CXX_LIBRARY = "compiler-default";

CLANG_ENABLE_MODULES = YES;

CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;

...

}

然而在給xcodeproj新增資源或者檔案的時候就不一樣了。資源大多數是這樣的 :

012EEC861DACDC6F007833C4 /* XXXView.m in Sources */ = {isa = PBXBuildFile; fileRef = 012EEC5C1DACDC6F007833C4 /* XXXView.m */; };

這裡面就出現了個比較蛋疼的東西 就是 012EEC861DACDC6F007833C4 這個識別符號,查了下發現這個是唯一識別符號,蘋果預設生成與資源一一對應的。所以我們新增資源的時候需要生成唯一識別符號,這個技術難度就比較大了。

在遇到這個問題的時候想到了NB的cocoapods,cocoapods最後也是生成了一個.a檔案然後新增到工程中,那麼cocoapods應該也有實現的方法。

經過一系列的search之後,找到了cocoapods中的xcodeproj框架,專門用於新增資原始檔的。

xcodeproj的有文件,也有很多的資料,這裡有不贅述了,有需要的可以看下面的連結:

draveness.me/bei-xcodepr…

blog.wtlucky.com/blog/2016/1…

github.com/CocoaPods/X…

最後簡單的上下程式碼:

target為:子模組framework的名稱

path = $iphonePath + '/XXX.xcodeproj' # the project_path

project = Xcodeproj::Project.open(path)

projectTarget = project.targets.first

targetFramework = target + 'Framework'

targetPath = $reposPath + target + '/' + targetFramework + '/' + target + '.framework'

reference = project.frameworks_group.new_reference(targetPath)

projectTarget.frameworks_build_phase.add_file_reference(reference, true)

題外話:

ruby語言確實非常的好用,簡單易讀,很優雅~ 有空的可以學學~

相關文章