小白初学CocoaPods组件管理,做一个阶段小结,有些术语描述不当,不吝指正!
私有库组件管理核心思路:
- 私有库搭建
- 私有库添加podspec
前言
CocoaPods通过什么管理组件?当然是通过NAME.podspec文件,只要NAME.podspec 文件是有效的,都可以加入CocoaPods Spec Repo(Repository)中。
- 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远程仓库地址。
- 验证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个:
- 第三方开源库的podspec,比如Masonry;
- 通过pod spec create SpecName;
- 通过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就能完成,不过仓库最好什么内容也不加,因为LICENSE,README,.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
注:第一次写博客,写的不好,如果觉得对你有所帮助,不妨点个赞!哈哈哈。。。