使用Cocoapods创建私有库

五一之后,公司要求对代码进行整理,同时进行代码管理、自动化打包等标准化流程,这些东西一直是我想搞的,这次有了公司的支持,操作起来也更顺利了,代码管理、自动化打包会找时间写一篇博客,这次主要记录利用Cocoapods将多个项目中共用的代码抽离出私有库,方便其他项目的引用,也算是组件化的第一步吧。抽离出私有库的时候,参考了很多的博客,遇到了很多的问题,主要参考了这篇博客

为什么要进行代码抽离

很多公司不止有一个产品,当项目达到两个及以上的时候,就需要考虑代码的共用(理想情况下)。由于我们公司特殊情况(懒),原来做项目的时候没有考虑这么多,由于公司新项目与原来的项目有大量功能相似,当时我们就采用了创建新分支的形式创建了新项目,导致代码耦合性非常强,平常开发中遇到很多问题,比如:

  • 有些代码可能这个项目需要,那个项目不需要
  • 分支切换太过频繁
  • 创建了大量分支
  • 在这个分支上开发的时候,测试需要另一个项目的包,需要来回切换
  • 。。。。等等

先看下我们原来的代码结构,确实感觉很头疼:


image

综上所述,代码抽离迫在眉睫。。。。

1、创建私有Spec Repo

Spec Repo其实类似一个容器,里面装着所有的公开的Pods,当使用Cocoapods后,他就会被clone到本地的~/.cocoapods/repos目录下:

image

因此我们也需要创建一个私有的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

之后会出现下列问题:

DA3D7B14F4D628E154A175EFFDE87B27

接下来就是在你的ZJPodPrivateTest文件夹下添加自己的内容,将自己的模块部分放在ZJPodPrivateTest/Classes下,然后cdExample文件夹下执行pod update命令,之后打开项目,就能在Development Pods/ZJPodPrivateTest文件夹下看到自己添加的组件了,之后需要将项目推送到远端仓库,同样需要先自己去git服务商哪里创建一个私有仓库,然后cdZJPodPrivateTest目录,执行如下操作:

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操作会报如下错误:

C3672E624EF076875C02B836EFE87ED7

提示你需要先pull下代码,这一步不能直接pull,需要执行如下命令:

git pull origin master --allow-unrelated-histories
D6043786E0DA1A559CA1DA5F27EB3F90

有可能会出现冲突,解决冲突之后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

当看到

6CECC0B42712110AA9F952FFE1C2E179

就说明验证通过

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中的缘故

EEBF626209D091109DC43B9298F96E26



5B479CE603BFA168CD47132A8E8E5781

确认无误后,就可以提交podspecSpec Repo中了

4、提交podspec

提交很简单,只需要一个命令:

pod repo push ZJTestSpecs ZJPodPrivateTest.podspec  #前面是本地Repo名字 后面是podspec名字
481992FDCEF1AB9F310B905AF4D4A

没有错误之后,就可以在~/.cocoapods/repos/ZJTestSpecs目录下看到自己的私有库了,同时我们远程的Spec Repo也有一次提交,已经被自动push上去了

可以用pod search ZJPodPrivateTest查看自己的库了

714E14C7AA77A9CDECE5C5334B28F057

*一定要记住自己的创建的私有库一定不要跟Github上的第三方库重名,否则会搜不到,我博客里面有的是ZJPodPrivateTest有的是ZJPodTest,就是因为ZJPodTestGithub上的一个第三方库重名了,才会又重新建了ZJPodPrivateTest,按照我博客操作的时候ZJPodPrivateTestZJPodTest可以认为是同一个仓库,有的截图了,有的忘了,有不明白的,可以问我!!!

至此,自己的私有库就算制作好了

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

这里写得很详细,参考这个吧

遇到的坑

错误一

409FDEA31A5A4FA21B2B14E42D7D96A4

pod lib lint 验证的时候一直报这个错,原因是私有库中添加了动态库或者静态库,解决方案:

pod lib lint --use-libraries

--use-libraries:表示使用静态库或者是framework,这里主要是解决当我们依赖一些framework库后校验提示找不到库的时候用到。

错误二

E03336C72F6E450A612C4021C7FA09E6

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

我之所以报这个错,是因为,修改了自己的私有库,打了tagpodspec文件对应的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上存在的第三方库重名也是我摸索很久发现的,希望看到这篇文章的同学能够少走弯路❤️❤️❤️❤️

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,198评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,663评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,985评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,673评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,994评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,399评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,717评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,407评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,112评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,371评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,891评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,255评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,881评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,010评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,764评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,412评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,299评论 2 260

推荐阅读更多精彩内容