CocoaPods 私有库组件管理小结

小白初学CocoaPods组件管理,做一个阶段小结,有些术语描述不当,不吝指正!
私有库组件管理核心思路:

  • 私有库搭建
  • 私有库添加podspec

前言

CocoaPods通过什么管理组件?当然是通过NAME.podspec文件,只要NAME.podspec 文件是有效的,都可以加入CocoaPods Spec Repo(Repository)中。

  1. CocoaPods Spec Repo
    故名思义就是CocoaPods存放管理NAME.podspec的仓库,ConcoPods官方提供的Spec Repo 本地仓库为~/.cocoapods/repos目录下的trunk,安装CocoaPods的时候,会默认添加。

注:CocoaPods 1.7.2后为trunk,之前为master,其实大同小异。

pod repo list

可以查看~/.cocoapods/repos目录下的所有Spec Repo,结果如下图所示。



因为我的电脑没有添加其它Spec Repo,所以只有1条记录,其中trunk为ConcoPods官方管理的Spec Repo本地仓库。URL对应的是Spec Repo远程仓库地址。

  1. 验证NAME.podspec的有效性
    NAME.podspec的有效性需要满足podspec的基本语法规范,本文不做详细说明官方链接,并且通过以下两条指令的验证。
pod spec lint [NAME.podspec|DIRECTORY|http://PATH/NAME.podspec ...]
pod lib lint [PODSPEC_PATHS ...]

两个命令如果省略 lint 后面内容,会自动验证当前目录下的NAME.podspec。
CocoaPods官方对两条指令的说明:
The difference between them is that pod lib lint does not access the network, whereas pod spec lint checks the external repo and associated tag.

私有库搭建流程

搭建私有库,核心流程有以下两点:

  • 创建Spec Repo远程仓库,用以管理NAME.podspec;
  • Spec Repo远程仓库和本地关联。

所谓私有库,就是搭建一个和trunk类似的自己使用的Spec Repo仓库,需要自己维护管理podspec文件。个人理解,这里的“私有”和Spec Repo远程仓库的公开或私有没有任何关系,Spec Repo远程仓库是私用或者公开取决于自己。不过公开好像意义也不大,因为官方有公开的Spec Repo仓库,把自己想公开的podspec加到这里即可。

创建Spec Repo远程仓库

GitHub 2019年后免费开放了私有仓库的创建,因此本文使用GitHub 创建Spec Repo远程私有仓库,创建的过程网上有很多资料,不细说。创建完成后会得到仓库的远程地址,本文的Spec Repo远程仓库地址为:

https://github.com/laiTree/MySpecRepo.git
Spec Repo远程仓库和本地关联

把Spec Repo远程仓库关联到本地可以通过下面指令进行:

pod repo add SpecRepoName GitURL [BRANCH]

SpecRepoName为Spec Repo远程仓库本地名字,GitURL为Spec Repo远程仓库地址。把刚才创建的Spec Repo远程仓库关联到本地:

pod repo add MySpecRepo https://github.com/laiTree/MySpecRepo.git

完成后通过pod repo list命令查看:



可以看到在本地生成了MySpecRepo仓库。

私有库添加podspec

用自己创建的私有库添加podspec有以下几个关键点:

  • 如何获得podspec;
  • 如何验证podspec;
  • 如何把podspec添加到私有库。
如何获得podspec

获得podspec的方式个人总结有3个:

  1. 第三方开源库的podspec,比如Masonry;
  2. 通过pod spec create SpecName;
  3. 通过pod lib create PodName。

第一种方式,podspec已经完全写好了,不过不能管理自己的代码。
第二种方式,podspec官方模版样式,完全需要自己填写,可谓是一穷二白。
第三种方式,生成了Pod工程,包括了简陋的podspec,基本足够测试使用。


注:Pod个人理解就是所谓的组件吧,podspec只是管理Pod的工具,描述了Pod的基本信息、依赖、代码文件组织方式等等内容

官方也推荐使用第三种方式,通过下面指令创建Pod:

pod lib create MakeApple(Pod工程名字,也是podspec的名字)

执行上面命令,会出现下面回答问题界面:


按需回答问题后,即创建了MakeApple Pod工程,默认自动由Xcode打开,工程目录如下所示:


本地目录结构为:



Example为Pod工程测试代码存放位置,MakeApple为Pod 代码存放位置,为了简单本文什么也不添加,podspec默认的内容为:

Pod::Spec.new do |s|
  s.name             = 'MakeApple'
  s.version          = '0.1.0'
  s.summary          = 'A short description of MakeApple.'
  s.description      = <<-DESC
TODO: Add long description of the pod here.
                       DESC

  s.homepage         = 'https://github.com/laiTree/MakeApple'
  s.license          = { :type => 'MIT', :file => 'LICENSE' }
  s.author           = { 'example' => 'example@163.com' }
  s.source           = { :git => 'https://github.com/laiTree/MakeApple.git', :tag => s.version.to_s }

  s.ios.deployment_target = '8.0'
  s.source_files = 'MakeApple/Classes/**/*'
end

注:s.author 脱敏处理了,😓

如何验证podspec

在Pod工程podspec 所在目录执行指令

pod lib lint

结果如下所示:



NOTE不需关注,只是和Xcode相关,还有2个WARN。
执行指令

pod spec lint

结果如下所示:



有2个WARN,和pod lib lint一样,还有1个ERROR,这也说明了两条指令的区别。
为了保证podspec添加到私有库成功,必须保证没有ERROR,尽量减少WARN。执行上面任意一条指令都可以,不过都需要解决下面问题。
上面验证存在两个共性问题:

  • s.summary没有意义
  • s.homepage不可达

pod spec lint ERROR为远程仓库不存在。


注:此处的远程仓库为代码仓库,即存放Pod代码,和前面Spec Repo远程仓库不是同一个哦。来硬的让它们为同一个也没人阻止你,不过没有任何意义,😂

创建远程代码仓库和创建Spec Repo远程仓库一样,借助GitHub就能完成,不过仓库最好什么内容也不加,因为LICENSEREADME.gitignore等pod lib create默认就创建了,pod lib create就是这么的好用。创建好代码远程仓库后,拿到代码远程仓库的地址,本文的地址为:

https://github.com/laiTree/MakeApple.git

万事具备,解决podspec存在的问题:

s.summary          = '我修改好了.'
s.homepage         = 'https://github.com/laiTree/MakeApple'
s.source           = { :git => 'https://github.com/laiTree/MakeApple.git', :tag => s.version.to_s }

把Pod工程代码上传到代码远程仓库,并且打上和s.version一致的tag,不熟悉的话,该温习git的指令了,这里不做详细说明。
重新验证podspec,pod lib lint和pod spec lint的验证结果一致,如下所示:


可以看到绿色文字,说明podspec通过了验证。

把podspec添加到私有库

在Pod工程podspec所在目录,通过下面指令,把podspec添加到Spec Repo私有库中:

pod repo push SpecRepoName [NAME.podspec]

SpecRepoName为Spec Repo私有库名字,NAME.podspec为验证通过的podspec,把本文通过验证的podspec添加到自己的MySpecRepo私有库中:

pod repo push MySpecRepo MakeApple.podspec

执行指令过程如下所示:


pod repo push指令的执行过程为:

  • 验证podspec;
  • 更新本地MySpecRepo私有库,即把podspec添加到本地MySpecRepo;
  • 把本地MySpecRepo上传到MySpecRepo远程仓库。

查看~/.cocoapods/repos/MySpecRepo如下所示:


MakeApple目录结构为:MakeApple/0.1.0/MakeApple.podspec
查看MySpecRepo远程仓库,如下所示:


由此可以确定,MakeApple.podspec成功添加到MySpecRepo私有库中。


注:私有Spec Repo不仅可以添加自己Pod的NAME.podspec,同时也可以添加第三方Pod的NAME.podspec,如Masonry。这对限制访问外网,构建私有的Spec Repo是有必要的。

使用自己的Pod

新建Xcode工程,创建Podfile文件,在Podfile中添加自己的Pod,如下所示:

#根据实际设置
platform :ios, '9.0'
#私有库远程仓库地址
source 'https://github.com/laiTree/MySpecRepo.git' 

target 'TestMakeApple' do
  use_frameworks!

  pod 'MakeApple', '~>0.1.0'

end

然后执行:

pod install

重新打开工程,如下所示:


说明MakeApple成功添加到新工程的依赖中。


注:如果使用了CocoaPods 管理的第三方Pod,需要添加CocoaPods官方Spec Repo远程仓库地址

source 'https://cdn.cocoapods.org/'

删除私有库

pod repo remove SpecRepoName

别人使用你的私有库

把Spec Repo远程仓库关联到他电脑本地:

pod repo add SpecRepoName GitURL [BRANCH]

如果Spec Repo远程仓库为私有,需要输入用户名,密码。


注:如果不关联到本地其实也可以正常使用,只需要Podfile中 source 引用Spec Repo 远程仓库地址,这样会自动把Spec Repo关联到本地,缺点就是不能决定本地Spec Repo的名字

私有库原理解析

Spec Repo维护了Pod NAME.podspec信息,NAME.podspec中的s.source指定了Pod代码远程仓库的地址,同时NAME.podspec还描述了Pod 的基本信息、依赖、代码文件组织方式(文件层级结构)等内容。

Podfile 使用Pod时
加入source ‘SpecRepoGitURL’,即Spec Repo远程仓库地址
pod ‘NAME’ 会到Spec Repo远程仓库中查找对应Pod 的NAME.podspec信息,由此找到Pod代码仓库的地址,加入工程。NAME.podspec描述的Pod 源码组织方式决定了Pod在Xcode中源码展开方式。

参考链接

CocoaPods Guides
Creating Your First CocoaPod
Xcode project中引入Cocoapods管理
CocoaPods 私有仓库的创建(超详细)
制作自己的cocoapods
教你如何从0到1实现组件化架构
Cocoapods使用私有库中遇到的坑
Cocoapods 应用第二部分-私有库相关
使用Cocoapods创建私有podspec


注:第一次写博客,写的不好,如果觉得对你有所帮助,不妨点个赞!哈哈哈。。。

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

推荐阅读更多精彩内容