
一.CocoaPods
CocoaPods能够管理Xcode项目的第三方依赖库。项目的依赖项会在Podfile文件中指定。CocoaPods解析库与项目之间的依赖关系,获取源代码,然后在Xcode工作区中将它们链接在一起以构建项目。
最终目标是通过创建更加集中的生态系统来提高第三方开源库的可发现性和参与度。
在没有使用CocoaPods的情况下,开发者在集成第三方库时会面临各种问题,需要针对每个第三方库做以下步骤:
1.Download and unzip files UIFoundation
2.Drag frameworks and bundles to your project
3.Link with new iOS libraries
4.Add linker flags
...
CocoaPods是一个依赖项管理器专门为iOS应用添加第三方库而编写的,同时也是谷歌大力扶持的项目,使用CocoaPods给开发带来了很大的便携性。
二.安装CocoaPods
- 使用
RubyGems
工具安装CocoaPods
,一种依赖项管理器来装另一种依赖项管理器。首先使你的Gems工具是最新:
$ sudo gem update --system
- 安装
CocoaPods
,这个过程需要花费一些时间。如果在安装过程中遇到任何问题,请访问指南
$ sudo gem install cocoapods
- 安装好后,执行
pod setup
命令,从CocoaPods
的Specs repository
(理解为git仓库,资源库,数据库)下载所有的Podspec文档到本地的Specs repository
。
$ pod setup
到此,准备工作已经结束,然后创建Podfile
文件进行集成第三方库,此处不做介绍。
三.解读CocoaPods
-
在安装好后项目目录会多出几个文件:
APP.xcworkspace
:管理源项目和pod项目,同时将所有第三方库编译成静态库。
Podfile
:不做解释。
Podfile.lock
:此文件是在执行pod install
或pod update
命令后出现的。
举例说明功能:A在执行pod install
命令后,会将AFNetWorking
(假如下载的是3.0版本)信息存入Podfile.lock
此文件中。当B执行pod install
命令时,CocoaPods
会检查Podfile.lock
文件中是否存入了AFNetWorking
,如果有相关信息,即使CocoaPods
有了3.1版本的AFNetWorking
,CocoaPods
也不会去下载最新的。只有当执行了pod update
命令,会忽略Podfile.lock
中的信息,下载最新的AFNetWorking
,并更新Podfile.lock
中的信息。
有关pod install
和pod update
区别点击这里
-
CocoaPods
中的Semantic Versioning:
例如:version 1.5.6
6代表补丁编号(Patch),一般性规则,当开发者修复bug时,在不影响向后兼容的情况下可以修改6这个数字。
5代表次版本号(Minor),开发者增加新的功能,将会增大此编号,也是保证能向后兼容的。
1代表主版本号(Major),开发者修改代码,破坏向后兼容时,将会增大此编号。
题外话:在
Podfile
中经常会遇到~>
(英文名叫twiddle wake), 这个~>
表示:在执行pod update
时,允许CocoaPods
自动更新最后一位的更新。
例如:~>1.5.6
,如果有1.5.7
,1.5.10
等版本会自动更新,但是1.6.1
不会更新。
~> 1.5
表示,如果有1.5.7
,1.6.1
等版本会自动更新,但是2.0.0
不会更新。
【注意】:Semantic Versioning
只是个规则或者是惯例,并不是说所有开发者都会遵守这个规则。
四.背后发生了什么
- Adds libPods.a to: targets => build phases => link with libraries.
- Adds the CocoaPods Xcode configuration file to your app’s project.
- Changes your app's target configurations to be based on CocoaPods's.
- Adds a build phase to copy resources from any pods you installed to your app bundle. i.e. a ‘Script build phase’ after all other build phases with the following:
- Shell:
/bin/sh
- Script:
${SRCROOT}/Pods/PodsResources.sh
- Shell:
1.CocoaPods
会将所依赖的第三方库分别打包成.a
文件,最后合成为libPods.a
添加到项目内。
2.CocoaPods
通过一个名为 Pods.xcconfig
的文件来在编译时设置所有的依赖和参数。
3.主要通过脚本文件PodsResources.sh
在编译期将第三方资源文件复制到项目bundle
内。
五.开源库/私有库
在讲开源库和私有库之前先讲一些常识,这点东西是自己理解出来的,很多网上资料并没有直接说到这些东西。
先来认识几个词:
-
.podspec
:说明文件,里面包含名称,版本号,资源指向,开发者信息,依赖项等。 -
Specs repository
/Specs repo
:说明文件的仓库,用来存放发布者提交的Specs
。对于开源库来说CocoaPods
管理着这个仓库,git地址是:https://github.com/CocoaPods/Specs.git
;对于私有库来说,需要开发者自行建立私有仓库存储Specs
文件。 -
Pods repository
:代码仓库,用于存放开发者发布的代码,私有库和开源库都是需要自行创建的一个代码仓库。
【总结】:开源库还是私有库都需要两个仓库,一个用于存放文件说明,一个用于存放代码。在Podfile
文件顶部,经常看到下面两句
//在没有添加私有库的时候,Podfile默认指向官方Specs repository,在添加了私有库后,默认指向消失,需要添加这句话
source 'https://github.com/CocoaPods/Specs.git'
//指向自己创建的私有Specs repository
source '自己创建的git仓库'
⚠️注意上面这些指向都是指向Specs repository
,不是指向Pods repository
,这里一定要注意。
这里留一个问题:有些人会想,既然发布代码库需要两个仓库,那就会出现4种组合情况:
私有库
1.Private Specs repository
和Private pod repository
这个叫私有库吗?我的理解不能叫私有库,
我也没尝试是否行的通,这里的例子是这么创建。
2.Private Specs repository
和Public pod repository
开源库
3.Public Specs repository
和Public pod repository
已测试行不通
4.Public Specs repository
和Private pod repository
这里给出简单的创建步骤:
开源库
:
1.创建Public Pod repository
2.创建项目模版,在模版中添加代码
$ pod lib create [POD_NAME]
3.提交代码
$ git add .
$ git commit -m “Initial Commit“
$ git remote add origin [URL]
$ git push -u origin master
4.添加并推送tag,tag是必须添加的。每个仓库的releases对应的版本都是依赖tag的,在执行pod install的时候也是拉取releases中的某个tag的版本,所以tag很重要。
$ git tag 0.1.0
$ git push origin 0.1.0
5.编辑.Podspec文件
6.验证文件
$ pod lib lint xxx.podspec
或者
$ pod spec lint xxx.podspec
7.推送Spec文件到Specs repository仓库
$ pod trunk push xxx.podspec
[结束]
私有库
:
1.创建Private Specs repository
2.创建Private /Public Pod repository
3.关联本地仓库(REPO_NAME)与Private Specs repository(SOURCE_URL)。
$ pod repo add [REPO_NAME] [SOURCE_URL]
关联成功可以通过命令查看
$ cd~ / .cocoapods / repos / REPO_NAME
4.创建项目模版,在模版中添加代码,并提交代码
$ pod lib create [POD_NAME]
5.编辑.Podspec文件
6.添加并推送tag,tag是必须添加的。
$ git tag 0.1.0
$ git push origin 0.1.0
7.验证文件
$ pod lib lint xxx.podspec
或者
$ pod spec lint xxx.podspec
8.推送Spec文件到Specs repository仓库
$ pod repo push [REPO_NAME] [POD_NAME] .podspec
[结束]
其他成员想使用私有库,需要在本地执行步骤3,同时需要在Podfile文件内添加指向
$ pod repo add [REPO_NAME] [SOURCE_URL]
对于创建开源库/私有库的详细步骤,请自行“百度”。
网友评论