最近的需要做一個自動打包各個子模組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的有文件,也有很多的資料,這裡有不贅述了,有需要的可以看下面的連結:
最後簡單的上下程式碼:
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語言確實非常的好用,簡單易讀,很優雅~ 有空的可以學學~