需求背景:公司業務模組,需要下沉為獨立的遠端pod,以達到解除相互依賴和加快測試編譯速度的效果,做到脫離主工程單獨除錯開發大部分功能,而殼工程難免需要用到一些通用的功能如使用者資訊token等在網路請求內部的封裝,其他業務元件也需要用到,所以可以自己建立一個通用模板,基於此模板開發。
如:網路請求裡需要使用到認證的使用者資訊,此時需要在appDelegate內加入通用的OAuth方法開啟主app獲取授權的token等認證資訊,在殼工程內請求裡填充到對應的請求頭或者body內完成認證,以避免再次引入登入和使用者認證模組增大工程編譯量。
技術實現關鍵:
官方推薦的pod lib create yourPodName 會被隱式轉換為 pod lib create yourPodName --template-url=https://github.com/CocoaPods/pod-template.git, 故我們可以基於官方的template進行修改,做成自己的業務模組通用模板,使用--template-url引數指定模板來源
官方模板結構分析:
MyLib
├── .travis.yml
├── configure
├── LICENSE
├── NAME-osx.podspec
├── NAME.podspec
├── Pod
│ ├── Classes
│ ├── Assets
├── POD_LICENSE
├── POD_README.md
├── README.md
├── setup
│ ├── ConfigureiOS.rb
│ ├── ConfigureMacOSSwift.rb
│ ├── ConfigureSwift.rb
│ ├── MessageBank.rb
│ ├── ProjectManipulator.rb
│ ├── TemplateConfigurator.rb
│ └── test_examples
│ └── kiwi.m
│ └── quick.swift
│ └── specta.m
│ └── xctest.m
│ └── xctest.swift
└── templates
│ ├── ios
│ └── Example
│ └── Podfile
│ └── PROJECT
│ └── PROJECT.xcodeproj
│ └── Tests
│ └── macos-swift
│ └── Example
│ └──swift
│ └── Example
以上為模板目錄內的大致檔案結構,可以很清晰的看到內部結構,主入口為configure,然後呼叫TemplateConfigurator.rb等相關指令碼建立 相關指令碼的各自功能: TemplateConfigurator.rb :詢問使用者是建立iOS還是macOS的型別,以及oc還是swift的型別,然後根據使用者輸入依次呼叫對應的指令碼,此次將主要針對iOS oc的建立來說明 ConfigurationiOS.rb/ConfigureMacOSSwift.rb/ConfigureSwift.rb,然後執行以下操作 replace_variables_in_files #將類的註釋替換為對應的日期,作者等 PROJCT_OWNER 替換為作者 PROJECT 替換為你建立的庫名,TODAYS_YEAR,TODAYS_DATE 替換為日期 clean_template_files #清理臨時檔案 rename_template_files #重新命名臨時檔案 add_pods_to_podfile #新增pod至podfile customise_prefix #批量重新命名類字首(CPD開頭類) rename_classes_folder #資料夾重新命名 ensure_carthage_compatibility #適配carthage用法 reinitialize_git_repo # run_pod_install #執行pod install安裝工程
@message_bank.farewell_message #完成後顯示歡迎
複製程式碼
ConfigurationiOS.rb 詢問是否建立demo殼工程,由於我們正是要建立殼工程,所以perform方法這裡註釋掉直接keep_demo = :yes即可預設建立demo殼工程 詢問是否使用單元測試框架,framework = :none 根據需求直接不使用即可 詢問類字首,此處保留,依各業務模組需求命名類字首
ProjectManipulator.rb 先執行指定格式文字替換 @string_replacements = { "PROJECT_OWNER" => @configurator.user_name, #此處有一個注意點,當git配置為中文名時,會報錯 "TODAYS_DATE" => @configurator.date, #修改為建立日期 "TODAYS_YEAR" => @configurator.year, #修改為建立年 "PROJECT" => @configurator.pod_name, #修改為你的lib名 "CPD" => @prefix #將CPD修改為你自己定義的字首 } 再呼叫主要裝配工程的指令碼,原指令碼寫死了只有以下四個類會重新命名並copy到建立的模板 ["CPDAppDelegate.h", "CPDAppDelegate.m", "CPDViewController.h", "CPDViewController.m"].each do |file| before = project_folder + "/PROJECT/" + file next unless File.exists? before
after = project_folder + "/PROJECT/" + file.gsub("CPD", prefix)
File.rename before, after
複製程式碼
因為模板工程裡需要加入我們自己的一些類,保證同時copy過去,需要先開啟templates/ios/Example/project.xcodeproj工程,如普通專案一樣向工程內新增程式碼,然後將生成的類重新命名為CPD開頭的類,保證重新命名時能覆蓋到 然後修以上copy和重新命名的程式碼為 oriFiles = Dir[project_folder + "/PROJECT/*"] oriFiles.each do |file| puts "original file is " + file #log輸出重新命名前的類檔案 puts "" before = file next unless File.exist? before after = file.gsub("CPD", prefix) puts "rename file is " + after #log輸出重新命名以後的類檔案 puts "" 這樣就會自動將該project目錄下的所有檔案重新命名移動,不需要手動每個檔案新增
針對以上新增入的CPD開頭的檔案,如果有使用了自己對應的pod庫依賴的,在podfile裡新增,並且注意在podfile頭加入source避免找不到
最後根據pod lib create --template-url=yourGit 即可自動建立對應的模板類 已經修改好的demo模板地址:github.com/iPermanent/… 可以使用看效果,去除了平臺提示,並直接使用oc,去除了swift語言提示以及單元測試框架的提示,只保留了輸入類字首的功能(預設整合了自己的HRCocoaTools/Category,僅用於示例,可自行去除)