五一之后门岔,公司要求對代碼進(jìn)行整理爱致,同時進(jìn)行代碼管理、自動化打包等標(biāo)準(zhǔn)化流程寒随,這些東西一直是我想搞的糠悯,這次有了公司的支持,操作起來也更順利了妻往,代碼管理互艾、自動化打包會找時間寫一篇博客,這次主要記錄利用Cocoapods將多個項(xiàng)目中共用的代碼抽離出私有庫讯泣,方便其他項(xiàng)目的引用纫普,也算是組件化的第一步吧。抽離出私有庫的時候好渠,參考了很多的博客昨稼,遇到了很多的問題,主要參考了這篇博客晦墙。
為什么要進(jìn)行代碼抽離
很多公司不止有一個產(chǎn)品悦昵,當(dāng)項(xiàng)目達(dá)到兩個及以上的時候,就需要考慮代碼的共用(理想情況下)晌畅。由于我們公司特殊情況(懶)但指,原來做項(xiàng)目的時候沒有考慮這么多,由于公司新項(xiàng)目與原來的項(xiàng)目有大量功能相似抗楔,當(dāng)時我們就采用了創(chuàng)建新分支的形式創(chuàng)建了新項(xiàng)目棋凳,導(dǎo)致代碼耦合性非常強(qiáng),平常開發(fā)中遇到很多問題连躏,比如:
- 有些代碼可能這個項(xiàng)目需要剩岳,那個項(xiàng)目不需要
- 分支切換太過頻繁
- 創(chuàng)建了大量分支
- 在這個分支上開發(fā)的時候,測試需要另一個項(xiàng)目的包入热,需要來回切換
- 拍棕。。勺良。绰播。等等
先看下我們原來的代碼結(jié)構(gòu),確實(shí)感覺很頭疼:
綜上所述尚困,代碼抽離迫在眉睫蠢箩。。。谬泌。
1滔韵、創(chuàng)建私有Spec Repo
Spec Repo
其實(shí)類似一個容器,里面裝著所有的公開的Pods,當(dāng)使用Cocoapods
后掌实,他就會被clone
到本地的~/.cocoapods/repos
目錄下:
因此我們也需要創(chuàng)建一個私有的Spec Repo
陪蜻,因?yàn)槭枪卷?xiàng)目,所以我們搞一個私有庫潮峦,這次是我單獨(dú)的練習(xí)囱皿,GitHub
上創(chuàng)建私有庫是收費(fèi)的勇婴,所以這次我采用了免費(fèi)的Git
服務(wù)忱嘹,我用的是Coding,首先需要在coding
上創(chuàng)建一個自己的git
倉庫耕渴,創(chuàng)建完成之后拘悦,在終端下執(zhí)行如下命令
pod repo add ZJTestSpecs https://coding.net/u/cenzhijun/p/ZJTestSpecs/git
成功的話就會在~/.cocoapods/repos
目錄下看到ZJTestSpecs
文件夾了,第一步完成橱脸,這一步通常只需要執(zhí)行一次
2础米、創(chuàng)建Pod
項(xiàng)目的文件
首先cd
到你想創(chuàng)建項(xiàng)目的文件夾執(zhí)行如下操作
記住一定要創(chuàng)建一個單獨(dú)的名字,否則以后pod search <私有庫>
會找到Github
上跟你重名的項(xiàng)目
pod lib create ZJPodPrivateTest
之后會出現(xiàn)下列問題:
接下來就是在你的ZJPodPrivateTest
文件夾下添加自己的內(nèi)容添诉,將自己的模塊部分放在ZJPodPrivateTest/Classes
下屁桑,然后cd
到Example
文件夾下執(zhí)行pod update
命令,之后打開項(xiàng)目栏赴,就能在Development Pods/ZJPodPrivateTest
文件夾下看到自己添加的組件了蘑斧,之后需要將項(xiàng)目推送到遠(yuǎn)端倉庫,同樣需要先自己去git
服務(wù)商哪里創(chuàng)建一個私有倉庫须眷,然后cd
到ZJPodPrivateTest
目錄竖瘾,執(zhí)行如下操作:
git add -A
git commit -a -m "init library"
git remote add origin https://git.coding.net/cenzhijun/ZJPodPrivateTest.git
git push origin master
這個時候執(zhí)行push
操作會報(bào)如下錯誤:
提示你需要先pull
下代碼,這一步不能直接pull
,需要執(zhí)行如下命令:
git pull origin master --allow-unrelated-histories
有可能會出現(xiàn)沖突花颗,解決沖突之后push
代碼:
git push origin master
因?yàn)?code>podspec文件獲取版本控制的項(xiàng)目需要tag
號捕传,所以還要搭上一個tag
git tag -m "first release" 0.1.0
git push --tags #推送tag到遠(yuǎn)端倉庫
做完這些之后開始編輯podspec
文件,填上對應(yīng)的信息扩劝。
編輯完之后庸论,執(zhí)行如下命令,驗(yàn)證是否有效棒呛,不能有error
或者warning
:
pod lib lint
當(dāng)看到
就說明驗(yàn)證通過
3聂示、本地測試podspec文件
自己可以創(chuàng)建一個新項(xiàng)目,在Podfile
中指定自己編輯好的podspec
文件条霜,如下:(兩種方式填寫一種就行)
pod 'ZJPodPrivateTest', :path => '~/Desktop/ZJPodPrivateTest' # 指定路徑
# pod 'PodTestLibrary', :podspec => '~/Desktop/ZJPodPrivateTest/ZJPodPrivateTest.podspec' # 指定podspec文件
然后執(zhí)行pod install
命令安裝催什,然后打開項(xiàng)目發(fā)現(xiàn)庫文件已經(jīng)被加載到Pods
子項(xiàng)目中了,不過沒有在Pods
目錄下,而是在Development Pods/ZJPodPrivateTest
目錄下蒲凶,因?yàn)槭潜镜販y試項(xiàng)目气筋,沒有吧podspec
文件添加到Spec Repo
中的緣故
確認(rèn)無誤后,就可以提交podspec
到Spec Repo
中了
4旋圆、提交podspec
提交很簡單宠默,只需要一個命令:
pod repo push ZJTestSpecs ZJPodPrivateTest.podspec #前面是本地Repo名字 后面是podspec名字
沒有錯誤之后,就可以在~/.cocoapods/repos/ZJTestSpecs
目錄下看到自己的私有庫了灵巧,同時我們遠(yuǎn)程的Spec Repo
也有一次提交搀矫,已經(jīng)被自動push
上去了
可以用pod search ZJPodPrivateTest
查看自己的庫了
*一定要記住自己的創(chuàng)建的私有庫一定不要跟Github上的第三方庫重名,否則會搜不到刻肄,我博客里面有的是ZJPodPrivateTest
有的是ZJPodTest
瓤球,就是因?yàn)?code>ZJPodTest跟Github
上的一個第三方庫重名了,才會又重新建了ZJPodPrivateTest
敏弃,按照我博客操作的時候ZJPodPrivateTest
和ZJPodTest
可以認(rèn)為是同一個倉庫卦羡,有的截圖了,有的忘了麦到,有不明白的绿饵,可以問我!F康摺拟赊!
至此,自己的私有庫就算制作好了
5粹淋、使用制作好的Pod
在Podfile
文件中吸祟,內(nèi)容如下:
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、更新維護(hù)podspec
遇到的坑
錯誤一
pod lib lint
驗(yàn)證的時候一直報(bào)這個錯欢搜,原因是私有庫中添加了動態(tài)庫或者靜態(tài)庫,解決方案:
pod lib lint --use-libraries
--use-libraries
:表示使用靜態(tài)庫或者是framework谴轮,這里主要是解決當(dāng)我們依賴一些framework庫后校驗(yàn)提示找不到庫的時候用到炒瘟。
錯誤二
pod lib lint
的時候一直有一些警告,可以忽略掉這些警告:
pod lib lint --allow-warnings
--allow-warnings
:表示允許警告
保險(xiǎn)起見可以使用:
pod lib lint --use-libraries --allow-warnings
錯誤三
pod lib lint
驗(yàn)證通過第步,但是repo push
的時候卻一直報(bào)錯疮装,又忘截圖了,大概是這樣的:
xcodebuild: Returned an unsuccessful exit code. You can use `--verbose` for more information
我之所以報(bào)這個錯粘都,是因?yàn)槔疲薷牧俗约旱乃接袔欤蛄?code>tag翩隧,podspec
文件對應(yīng)的s.version
忘了修改了樊展,解決方案:
重新發(fā)一個release
版的,打上tag
之后,修改podspec
文件對應(yīng)的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
總結(jié)
創(chuàng)建私有庫的時候,盡管我參考的這篇文章已經(jīng)寫得十分詳細(xì)墩弯,但是還是有一個過時的操作吩跋,很導(dǎo)致操作錯誤,尤其是在本地倉庫push
到遠(yuǎn)程倉庫那里出現(xiàn)問題渔工,同時創(chuàng)建私有庫不能和GitHub
上存在的第三方庫重名也是我摸索很久發(fā)現(xiàn)的锌钮,希望看到這篇文章的同學(xué)能夠少走彎路????????