五一之后,公司要求對代碼進行整理,同時進行代碼管理、自動化打包等標準化流程,這些東西一直是我想搞的,這次有了公司的支持,操作起來也更順利了,代碼管理、自動化打包會找時間寫一篇博客,這次主要記錄利用Cocoapods將多個項目中共用的代碼抽離出私有庫,方便其他項目的引用,也算是組件化的第一步吧。抽離出私有庫的時候,參考了很多的博客,遇到了很多的問題,主要參考了這篇博客。
為什么要進行代碼抽離
很多公司不止有一個產品,當項目達到兩個及以上的時候,就需要考慮代碼的共用(理想情況下)。由于我們公司特殊情況(懶),原來做項目的時候沒有考慮這么多,由于公司新項目與原來的項目有大量功能相似,當時我們就采用了創建新分支的形式創建了新項目,導致代碼耦合性非常強,平常開發中遇到很多問題,比如:
- 有些代碼可能這個項目需要,那個項目不需要
- 分支切換太過頻繁
- 創建了大量分支
- 在這個分支上開發的時候,測試需要另一個項目的包,需要來回切換
- 。。。。等等
先看下我們原來的代碼結構,確實感覺很頭疼:
綜上所述,代碼抽離迫在眉睫。。。。
1、創建私有Spec Repo
Spec Repo
其實類似一個容器,里面裝著所有的公開的Pods,當使用Cocoapods
后,他就會被clone
到本地的~/.cocoapods/repos
目錄下:
因此我們也需要創建一個私有的Spec Repo
,因為是公司項目,所以我們搞一個私有庫,這次是我單獨的練習,GitHub
上創建私有庫是收費的,所以這次我采用了免費的Git
服務,我用的是Coding,首先需要在coding
上創建一個自己的git
倉庫,創建完成之后,在終端下執行如下命令
pod repo add ZJTestSpecs https://coding.net/u/cenzhijun/p/ZJTestSpecs/git
成功的話就會在~/.cocoapods/repos
目錄下看到ZJTestSpecs
文件夾了,第一步完成,這一步通常只需要執行一次
2、創建Pod
項目的文件
首先cd
到你想創建項目的文件夾執行如下操作
記住一定要創建一個單獨的名字,否則以后pod search <私有庫>
會找到Github
上跟你重名的項目
pod lib create ZJPodPrivateTest
之后會出現下列問題:
接下來就是在你的ZJPodPrivateTest
文件夾下添加自己的內容,將自己的模塊部分放在ZJPodPrivateTest/Classes
下,然后cd
到Example
文件夾下執行pod update
命令,之后打開項目,就能在Development Pods/ZJPodPrivateTest
文件夾下看到自己添加的組件了,之后需要將項目推送到遠端倉庫,同樣需要先自己去git
服務商哪里創建一個私有倉庫,然后cd
到ZJPodPrivateTest
目錄,執行如下操作:
git add -A
git commit -a -m "init library"
git remote add origin https://git.coding.net/cenzhijun/ZJPodPrivateTest.git
git push origin master
這個時候執行push
操作會報如下錯誤:
提示你需要先pull
下代碼,這一步不能直接pull
,需要執行如下命令:
git pull origin master --allow-unrelated-histories
有可能會出現沖突,解決沖突之后push
代碼:
git push origin master
因為podspec
文件獲取版本控制的項目需要tag
號,所以還要搭上一個tag
git tag -m "first release" 0.1.0
git push --tags #推送tag到遠端倉庫
做完這些之后開始編輯podspec
文件,填上對應的信息。
編輯完之后,執行如下命令,驗證是否有效,不能有error
或者warning
:
pod lib lint
當看到
就說明驗證通過
3、本地測試podspec文件
自己可以創建一個新項目,在Podfile
中指定自己編輯好的podspec
文件,如下:(兩種方式填寫一種就行)
pod 'ZJPodPrivateTest', :path => '~/Desktop/ZJPodPrivateTest' # 指定路徑
# pod 'PodTestLibrary', :podspec => '~/Desktop/ZJPodPrivateTest/ZJPodPrivateTest.podspec' # 指定podspec文件
然后執行pod install
命令安裝,然后打開項目發現庫文件已經被加載到Pods
子項目中了,不過沒有在Pods
目錄下,而是在Development Pods/ZJPodPrivateTest
目錄下,因為是本地測試項目,沒有吧podspec
文件添加到Spec Repo
中的緣故
確認無誤后,就可以提交podspec
到Spec Repo
中了
4、提交podspec
提交很簡單,只需要一個命令:
pod repo push ZJTestSpecs ZJPodPrivateTest.podspec #前面是本地Repo名字 后面是podspec名字
沒有錯誤之后,就可以在~/.cocoapods/repos/ZJTestSpecs
目錄下看到自己的私有庫了,同時我們遠程的Spec Repo
也有一次提交,已經被自動push
上去了
可以用pod search ZJPodPrivateTest
查看自己的庫了
*一定要記住自己的創建的私有庫一定不要跟Github上的第三方庫重名,否則會搜不到,我博客里面有的是ZJPodPrivateTest
有的是ZJPodTest
,就是因為ZJPodTest
跟Github
上的一個第三方庫重名了,才會又重新建了ZJPodPrivateTest
,按照我博客操作的時候ZJPodPrivateTest
和ZJPodTest
可以認為是同一個倉庫,有的截圖了,有的忘了,有不明白的,可以問我?。。?/p>
至此,自己的私有庫就算制作好了
5、使用制作好的Pod
在Podfile
文件中,內容如下:
source 'https://github.com/CocoaPods/Specs.git' # 官方庫
source 'https://git.coding.net/cenzhijun/ZJTestSpecs.git' # 私有庫
platform :ios, '8.0'
target 'TargetName' do
pod 'AFNetworking', '~> 3.0'
pod 'ZJPodPrivateTest', '0.1.0' #自己的私有庫
end
至此就算大功告成了
6、更新維護podspec
遇到的坑
錯誤一
pod lib lint
驗證的時候一直報這個錯,原因是私有庫中添加了動態庫或者靜態庫,解決方案:
pod lib lint --use-libraries
--use-libraries
:表示使用靜態庫或者是framework,這里主要是解決當我們依賴一些framework庫后校驗提示找不到庫的時候用到。
錯誤二
pod lib lint
的時候一直有一些警告,可以忽略掉這些警告:
pod lib lint --allow-warnings
--allow-warnings
:表示允許警告
保險起見可以使用:
pod lib lint --use-libraries --allow-warnings
錯誤三
pod lib lint
驗證通過,但是repo push
的時候卻一直報錯,又忘截圖了,大概是這樣的:
xcodebuild: Returned an unsuccessful exit code. You can use `--verbose` for more information
我之所以報這個錯,是因為,修改了自己的私有庫,打了tag
,podspec
文件對應的s.version
忘了修改了,解決方案:
重新發一個release
版的,打上tag
之后,修改podspec
文件對應的s.version
,重新pod repo push
溫馨提示:如果你在pod lib lint
的時候用到了--use-libraries
或者--allow-warnings
,那么在pod repo push
的時候也要加上這些指令?。?!例如:
pod repo push ZJTestSpecs ZJEncryptPodTest.podspec --use-libraries --allow-warnings
總結
創建私有庫的時候,盡管我參考的這篇文章已經寫得十分詳細,但是還是有一個過時的操作,很導致操作錯誤,尤其是在本地倉庫push
到遠程倉庫那里出現問題,同時創建私有庫不能和GitHub
上存在的第三方庫重名也是我摸索很久發現的,希望看到這篇文章的同學能夠少走彎路????????