文章目录
CocoaPods简介
在进行iOS开发的时候,一定离不开第三方库的使用,如果没有CocoaPods
,我们将要进行的工作是:
- 下载源代码
- 引入工程
- 向工程中添加开源库使用的
framework
- 解决依赖问题
- 检查重复添加的
framework
- 如果需要更新,重复以上步骤
但是现在CocoaPods
已经帮我们把上面的动作执行了,我们只需要执行配置podfile
等工作,其他的都不用亲自操作了
CocoaPods
就是一个管理第三方依赖库的工具 ,它在执行第三方库配置的同时会为我们创建一个workspace
文件来将第三方库和我们的工程连接起来,供我们开发使用。其存在的目的就是让开发者能自动化、集中的、直观的管理第三方开源库
CocoaPods结构
CocoaPods
是用Ruby写的,并由若干个Ruby包构成
-
CocoaPods/Specs
是保存podspec
文件的仓库,每引入一个第三方库,都会传一份podspec
文件给CocoaPods
,在这里面会有每个第三方库的每个版本,在podspec
文件中会有source
属性,通过source
属性中的链接去下载该第三方库
Specs
采用集中式管理
tips:打开隐藏文件夹的方式shift+command+.
-
CocoaPods/CocoaPods
是一个面向用户的组件,每当执行一个pod命令时,这个组件都会被激活。 -
CocoaPods/Core
这个gem
组件提供支持与CococaPods
相关文件的处理。比如,执行pod install
命令,Core
组件会解析podspec文件和podfile
文件,确定引入的文件。除此之外,执行与这些文件相关的命令也由该组件处理,比如pod spec lint
,检测podspec
文件的有效性 -
CocoaPods/Xcodeproj
在CocoaPods
中负责所有工程文件的整合。如果想写一个脚本来方便的修改文件,可以单独下载这个gem文件并使用
集成CocoaPods
之后,只能使用workspace
因为workspace
下的project
会共享build
(通常为 ~/Library/Xcode/DerivedData/
),Xcode通过这种方式发现隐式依赖并按序构建。如果使用project
就得手动将pod工程的产物拖入到link library with libraries
添加引用,并拷贝modulemap
等文件
podfile.lock
生成:在第一次pod install
时自动生成,会标注项目当前依赖库的准确版本(包括podfile
中直接标注需要使用的库和这些库依赖的其他库)
改变:在执行pod update
命令或修改podfile
文件里使用的依赖库后会生成新的podfile.lock
文件
好处:如果是多人共同开发,那么别人同步了你的podfile.lock
之后,直接执行pod install
就可以保证你们的库是同一版本的,是同步的,可以防止因为依赖库版本不同而产生的问题
例子:甲乙使用两个分支开发,甲添加了A库,在podfile中
指定版本1.0.1,A1.0.1依赖于B库,但是没有指明版本dependency 'A1', '~> 3.0'
,CocoaPods
会使用满足条件的最新版本,比如B 3.2。等乙在合并分支的时候,B已经有了3.3版本,CocoaPods
会使用B3.3版本,同样的podfile
,安装的版本不同。但是如果使用podfile.lock
的话,会记录你目前使用的库的准确版本,并且配置时也使用这个版本,就不会出错
manifest.lock
manifest.lock
是podfile.lock
文件的副本,在pods/
文件夹下,没有纳入git的版本控制,只有本地的改动会影响该文件,而podfile.lock
是会被别人的改动影响的。在项目bulid时,如果两个文件不同就会报the-sandbox-is-not-in-sync-with-the-podfile-lock
错
这个文件的目的是:在多人开发时的各个同伴都能及时知道依赖库更新了(podfile.lock
文件和manifest.lock
文件不同,也就是当前podfile.lock
文件和上次安装pod后的podfile.lock
不同),及时更新,防止依赖库版本不同造成的崩溃
pod命令们
第三方库安装时会在其对应的podspec
文件中找到它的resource
属性,在那里下载它的对应源,podspec
文件存储在repo
中
pod install
只会改变podfile
中新改变的东西
执行过程:
- 如果
podfile.lock
存在,直接从文件中读取信息下载,只会下载文件中指定版本,对于不在podflie.lock
文件中的库,pod install
命令会搜索这个pod库在podfile
文件中指定的版本来安装,在安装之后会根据podfile
中的描述解析,并在podfile.lock
中增加对应的内容 - 如果
podfile.lock
不存在,会读取podfile
文件内的框架信息,下载好之后生成podflie.lock
文件 - 生成或更新
podfile.lock
文件后,都会生成一个与之相同的manifest.lock
文件
pod repo update
从远程仓库更新本地的repo
(同步)
pod update
首先执行pod repo install
,接着会根据podfile
的规则更新所有库,不会理睬podfile.lock
,根据安装后的情况生成新的 podfile.lock
今天碰到的问题
我和同学共用一个子分支,他昨天合并了develop
分支,今早我pod install
报错,pod repo update
后就可以pod install
了
原因:比如同学合并了分支后的A库版本是1.0.2,而我本地podspec
文件中只有1.0.1版本,拿不到resource
属性中的对应源,无法下载。这时候就得同步远程仓库,将远程仓库中的podspec
文件clone到本地,之后pod install
就可以了