为什么要用?
1.合作方便:项目越来越大,开发人员越来越多,功能点互不干扰的情况,要加载整个项目运行起来是耗时的,比如天猫淘宝支付宝。组件化就是把功能模块拆分,你只要负责自己实现的部分做成库就好,有需要的人就可以拉取加载。就算你更新了某些功能,其他使用者只要pod update xxxx(你的库)就好了不要太方便。
2.自己方便:可以把常用的功能封起来,供自己的其他项目使用。
是什么?
CocoaPods is a dependency manager for Swift and Objective-C Cocoa projects. It has over 71 thousand libraries and is used in over 3 million apps. CocoaPods can help you scale your projects elegantly.
译:
CocoaPods是Swift和Objective-C Cocoa项目的依赖管理器。它拥有超过71000个库,被300多万个应用程序使用。CocoaPods可以帮助你优雅地扩展你的项目。
文件解释:
- Pod描述文件,一般来说表征你的项目地址,项目使用的平台和版本等信息
- 用户编写的对于期望加载的pod以及对应Target信息
- 记录了之前pod加载时的一些信息,包括版本、依赖、CocoaPods版本等
-
记录了本地pod的基本信息,实际上是Podfile.lock的拷贝。大部分开发者最熟悉的cocoaPods指令就是pod install,那具体在执行pod install时发生了什么呢?
- 分析Dependency。对比本地pod的version和podfile.lock中的pod version,如果不一致会提示存在风险。对了,cocoapods可以多版本存在,只要在pod _x.x.x_ install就能指定版本初始化。
- 对比podfile是否发生了变化。 如果发生变化,会生成两个列表,一个是需要Add的Pod(s),一个是需要Remove的Pod(s)。
- 添加需要的Pod(s)。如果是常规的基于GiCocoaPods库,则:
a. Spec下查找对应的Pod文件夹
b. 找到对应的tag
c. 定位其Podspec文件
d. copy到Pod文件夹中
e. 运行pre-Install hook - 生成Pod Project
a. 将该Pod中对应文件添加到工程中
b. 添加对应的framework、.a库、bundle等
c. 链接头文件(link headers),生成Target
d. 运行 post-install hook - 生成podfile.lock。生成此文件副本manifest.lock,放到Pod文件夹内。
The sandbox is not sync with the podfile.lock
这种错误,则表示manifest.lock和podfile.lock文件不一致),此时一般需要重新运行pod install
命令。 - 配置原有的project文件(add build phase)
a. 添加了 Embed Pods Frameworks
b. 添加了 Copy Pod Resources
pre-install hook 和 post-install hook可以理解成回调函数,是在podfile里对于install之前或者之后(生成工程但是还没写入磁盘)可以执行的逻辑,逻辑为:
pre_install do |installer|
# 做一些安装之前的hook
end
post_install do |installer|
# 做一些安装之后的hook
end
再具体的就不说了,大家去看看这个大佬写的文章,我的文章也摘了一些他写的部分,非常的好和详细,推荐给你们:
《基于CocoaPods的组件化原理及私有库实践》
怎么做?
此处以ZYUIToolsPod为例。
1. 通过CocoPods的官方命令来进行Pod项目的创建,
pod lib create HelloXXXPod
1.What platform do you want to use? [ iOS / macOS ]
应用在哪个平台上,一般我们选iOS
2.What language do you want to use? [ Swift / ObjC ]
使用何种语言,可以根据项目是OC还是Swift自行选择
3.Would you like to include a demo application with your library? [ Yes / No ]
问是否需要一个Demo工程,方便调试Pod。
2. ZYUIToolsPod.podspec
Pod::Spec.new do |s|
s.name = 'ZYUIToolsPod'
s.version = '0.2.0'
s.summary = 'Some UI Methods'
s.description = <<-DESC
Some encapsulated UI extension methods, and the usual String methods。
DESC
s.homepage = 'https://github.com/NULLGIRL/ZYUIToolsPod'
s.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = { 'NULLGIRL' => '422453403@qq.com' }
s.source = { :git => 'https://github.com/NULLGIRL/ZYUIToolsPod.git', :tag => s.version.to_s }
s.ios.deployment_target = '10.0'
s.source_files = 'ZYUIToolsPod/Classes/**/*.swift'
s.swift_version = '4.2'
s.frameworks = 'UIKit', 'CoreText', 'Foundation'
s.dependency 'SVProgressHUD','2.2.5'
end
重点的几个:
s.name
: 库名
s.version
: 版本号,每次更新的时候需要更改
s.homepage
: 主页路径
s.source
: 仓库地址
s.source_files
: 文件(如果不放在Classes下,记得要改)
s.swift_version
: swift 版本号, 本来没写这行出错了
s.frameworks
: 依赖的苹果库
s.dependency
: 依赖的第三方库
3. 本地调试:
把需要用到的库文件,拉到ZYUIToolsPod/ZYUIToolsPod/Classes下。
如果是通过pod lib create命令创建的Pod,会在Example中自动配置好该pod的本地调试脚本,如下:
use_frameworks!
target 'ZYUIToolsPod_Example' do
pod 'ZYUIToolsPod', :path => '../'
target 'ZYUIToolsPod_Tests' do
inherit! :search_paths
end
end
pod 'ZYUIToolsPod' :path => '../' ,在上层目录来下载ZYUIToolsPod这个pod。这是本地调试Pod的一种。
来到ZYUIToolsPod/Example/ 路径下 执行:pod install
后打开工程,这时候你的文件就被加载啦。
注意: swift的class权限用用public修饰。
以上没问题后,本地验证:
pod lib lint ZYUIToolsPod.podspec
4. 上传到github上
在github上创建一个仓库,https://github.com/NULLGIRL/ZYUIToolsPod.git
来到项目的根目录:
git add .
git commit -m "Init"
git remote add origin xxxxxxx //(替换为自己的实际git地址)
git push --set-upstream origin master
podSpec文件需要版本控制信息,所以我们要打一个Tag.
git tag -m "v0.1.0" 0.1.0
git push --tags
5. 向Spec Repo提交podspec
引用cocoapods官网:
pod trunk push [NAME.podspec] will deploy your Podspec to Trunk and make it publicly available. You can also deploy Podspecs to your own private specs repo with pod repo push REPO [NAME.podspec].
验证库:
pod spec lint [NAME.podspec]
如果你只是做一个私有库:
pod repo push ZYUIToolsPod ZYUIToolsPod.podspec --allow-warnings
如果你要做一个公有库,用pod trunk
pod trunk register orta@cocoapods.org 'Orta Therox' --description='macbook air'
# 先注册 , 会给邮箱发一封邮件,点击链接激活
//查看有没有注册,有的话就是相关的注册账号的信息
pod trunk me
pod trunk push [NAME.podspec]
pod trunk add-owner ARAnalytics kyle@cocoapods.org
#添加其他管理者
成功:
6.查查看
pod search ZYUIToolsPod
7.更新版本
#`s.version` : 版本号,每次更新的时候需要更改
s.verion = 0.2.0
git add .
git commit -m "更新"
git push
git tag -m "v0.2.0" 0.2.0
git push --tags
pod trunk push [NAME.podspec]
8.使用
在podfile文件内记得加上source源地址(私有库的使用需要)
source 'https://github.com/CocoaPods/Specs.git'
source 'https://xxxxxxxx'
platform :ios, "9.3"
inhibit_all_warnings!
target "NinthWallet" do
use_frameworks!
pod 'ZYUIToolsPod'
end
问题集锦
-
Unable to find a pod with name, author, summary, or description matching
首先去https://cocoapods.org 首页查找是否有你的库,
如果没有就真是没有,如果可以搜索的话,说明这个库是成功上传的。因为pod的缓存问题,把缓存的索引文件删除。
rm ~/Library/Caches/CocoaPods/search_index.json
pod search ZYUIToolsPod
2.An unexpected version directory 'Classes' was encountered for the
来到~/.cocoapods/repos/
目录下,把你的库文件ZYUIToolsPod给删除了,这是在example例子里,被拷贝进来的。可能会和search_index里的冲突了(我猜的,有知情的人可以讲讲)。之后
rm ~/Library/Caches/CocoaPods/search_index.json
pod search ZYUIToolsPod
- pod trunk push成功,也给出了链接路径,但是在cocoapods官网就是search不到。
比如我之前,https://cocoapods.org/pods/ZYUIToolsPod ,明明已经存在,但是在https://cocoapods.org搜不到,百思不得其解,所有的步骤都跟官网的一样。后来才发现,是因为我在pod trunk regeist这一步,官网给我发了个邮件,我点击链接,但是当时失效了,我没有在意,毕竟失效了我的库还是传上去了,(没想到变成了一个“野库”)。
后来我又pod trunk regiest了一遍,又给我发了一新的邮件,我点击,这回激活成功了,我的库也能搜索到了。
-
Unable to find the 'specs' repo. If it has not yet been cloned, add it via 'pod repo add'.
解决方法:
pod repo add [库名称] [库地址]
#eg : pod repo add ZYUIToolsPod https://github.com/NULLGIRL/ZYUIToolsPod.git
我干了,你随意🍺🍺🍺