iOS組件化開發之Pod私有庫
組件化的目的:
- 依賴解耦
- 開發靈活
- 團隊分工明確
- 提高代碼質量
- 加快編譯速度
- 解決多團隊開發相互影響問題
工具-必選:
- cocoapods 1.x 之後版本
- cocoapods-packager
- gitlab
工具-可選:
- zsh
- item2
cocoapods 是支持 svn 的,但是 git 相對方便一些。
`
OTBase` 爲例
**注:**以
一、創建私有庫
1、創建標準工程
爲方便快速生成統一工程結構的組件工程,使用如下命令來創建工程。如何使用 pod lib
`pod lib create OTBase`
目錄結構如下:
├── Example
│ ├── OTBase
│ ├── OTBase.xcodeproj
│ ├── OTBase.xcworkspace
│ ├── Pods
│ └── Tests
├── OTBase
│ ├── Assets
│ └── Classes
└── _Pods.xcodeproj -> Example/Pods/Pods.xcodeproj
主要有兩部分組成
- OTBase: 組件源碼
- Example:Demo 工程,會 pod OTBase 庫到此 demo 工程,方便調試
pod lib會從 github 下載模版工程,創建完成會自動打開 Example
下的OTBase.xcworkspace
,在 pod 的工程下有一個Development Pods目錄,pod 把我們的源碼做爲 Demo 工程的一個 pod 庫,這跟實際使用是一樣的了。只不過我們要改源碼。
2、修改 podspec
修改 OTBase.podspec內容,參考:
Pod::Spec.new do |s|
s.name = 'OTBase'
s.version = '0.1.0'
s.summary = 'Modular develope base module.'
s.description = <<-DESC
Base module is required for other module.
DESC
s.homepage = 'http://git.rigelxu.com/iOS_Base_Framework'
s.license = { :type => 'Copyright', :text => 'Copyright 2016, All rights reserved.\n' }
s.author = { 'Rigel' => '[email protected]' }
s.source = { :git => 'http://git.rigelxu.com/iOS_Base_Framework.git', :branch => 'master' } # :tag => s.version.to_s }
s.source_files = 'OTBase/Classes/**/*'
s.ios.deployment_target = '8.0'
s.frameworks = 'UIKit'
s.dependency 'MGJRouter', '~> 0.9.1'
end
爲了方便s.source
可以暫時指定 master
分支或者所在的分支。
3、打包
pod package OTBase.podspec
cocoapods-packager會打好可用的 framework 包含模擬器和真機。包放在工程目錄下的OTBase-0.1.0/ios.
注:pod package
默認使用的是 release 模式,如果需要打 debug,添加上參數--configuration
注意:如果需要切換源碼和二進制庫,需要將打好的.framework 上傳到存放二進制庫的單獨倉庫的與 podspec 版本對應的 tag 上。
4、提交組件至私有倉庫
更詳細的發佈流程
上面已經打出 framework,可以直接手動導 framework 的方式使用。當然更好的方法是使用 pod
.
- 在 gitlab創建一個spec倉庫
所有需要使用此倉庫的電腦上,添加pod私有倉庫
pod repo add 倉庫名 倉庫地址
驗證 podspec
pod spec lint OTBase.podspec --allow-warnings
提交 podspec文件到 spec 倉庫
pod repo push OTSpec OTBase.podspec
5、源碼、靜態庫切換
我們使用的第三方庫,pod到工程裏的都是源碼,pod 會在我們編譯的時候打成靜態庫/動態庫。但是組件開發的時候爲了提高編譯效率,默認使用靜態庫比較好,只有在需要的時候,比如遇到問題需要 debug,發佈生產
,再 pod 源碼到工程。
那麼如何快速方便的切換源碼和靜態庫?有以下幾個思路:
- 方法一:使用不同的 podspec,一個指向源碼,一個指向二進制庫;使用時在 podfile 裏修改對應庫名即可。比如靜態庫是
pod 'OTBase'
,源碼是pod 'OTBase_source_code'
方法二:添加環境變量,podspec 裏添加判斷如下:
if ENV['IS_SOURCE_CODE'] s.source_files = 'OTBase/Classes/**/*' else s.ios.vendored_frameworks = 'OTBase-0.1.0/ios/OTBase.framework' end
需要使用源碼時在命令前添加環境變量:如
IS_SOURCE_CODE=1 pod install
如果考慮源碼保密問題,可以將 framework 單獨放一個倉庫管理。podspec 的配置如下:
if ENV['IS_SOURCE_CODE'] || ENV['OTBase_SOURCE']
puts 'OTBase is source'
s.source = { :git => 'http://github.com/OurTeam/iOS_Base_Framework.git', :branch => 'master' }
s.source_files = 'OTBase/Classes/**/*'
else
puts 'OTBase is binary'
s.source = { :git => 'http://github.com/OurTeam_Binary/iOS_Base_Framework.git' :tag => s.version.to_s}
s.resource = 'OTBase.bundle' #有資源時使用,注意將.framework 裏的資源bundle 刪除,`.bundle` 與 `.framework` 一起打包成.zip
s.ios.vendored_frameworks = 'OTBase.framework'
end
二、使用私有庫
添加組件私有倉庫
pod repo add OTSpec http://github.com/OurTeam/spec.git
添加私有 repo 到 podfile,同時還需要添加原 pod master 倉庫,如下:
source https://git.xxx.com/spec.git
source 'https://github.com/CocoaPods/Specs.git
將要使用的組件添加至 Podfile
pod install
當需要 pod 源碼的時候先清理,再 install
pod cache clean OTBase rm -rf Pods/OTBase IS_SOURCE_CODE=1 pod install
三、一些坑
- 如果使用的是 git-lib,如果 group 是私有的,那麼無法創建 public 倉庫
- 之前直接把.framework上傳到 git-lib,以 http 下載文件的方式經常解壓失敗,換到其它 http 服務器 ok 了,可能文件跟文件的有效期有關。二進制庫也使用 git 倉庫的形式也沒這種問題了。
- 使用了環境變量後打包命令也要修改,
IS_SOURCE_CODE=1 pod package OTBase.podspec
- 如果有資源,資源會打包到 Framework 目錄裏。在使用二進制文件時,需要刪除Framework裏的資源文件,將資源
.bundle
與.framework
一起打包成.zip,參考此文:Pod二進制化 - 在源碼和二進制文件進行切換時,一定要先執行清理。
pod cache clean xxx
, 然後再刪除 Pods目錄 - 某個組件可以添加一個單獨的環境變量,以方便此開發中的組件使用源碼,其它組件使用二進制文件。否則Example 工程 pod install 的時候 OTBase target 就消失了,因爲默認使用了二進制的庫。