通过此篇文字可以学到:
- 什么是CocoaPods?
-
pod install
,pod update
,pod outdated
理解 -
podsepc
的编辑 - 公有库的发布
- 私有库的发布
正文开始了
5 .....
4 ....
3 ...
2 ..
1 .
什么是CocoaPods?
CocoaPods 是开发 OS X 和 iOS 应用程序的一个第三方库的依赖管理工具。利用 CocoaPods,可以定义自己的依赖关系 (称作pods),并且随着时间的变化,以及在整个开发环境中对第三方库的版本管理非常方便。
CocoaPods 背后的理念主要体现在两个方面。首先,在工程中引入第三方代码会涉及到许多内容。针对 Objective-C 初级开发者来说,工程文件的配置会让人很沮丧。在配置 build phases 和 linker flags 过程中,会引起许多人为因素的错误。CocoaPods 简化了这一切,它能够自动配置编译选项。
其次,通过 CocoaPods,可以很方便的查找到新的第三方库。当然,这并不是说你可以简单的将别人提供的库拿来拼凑成一个应用程序。它的真正作用是让你能够找到真正好用的库,以此来缩短我们的开发周期和提升软件的质量。
CocoaPods是用 Ruby 写的,并由若干个 Ruby 包 (gems) 构成的。在解析整合过程中,最重要的几个 gems 分别是:CocoaPods/CocoaPods,CocoaPods/Core, 和CocoaPods/Xcodeproj(是的,CocoaPods 是一个依赖管理工具 -- 利用依赖管理进行构建的!)。
编者注CocoaPods 是一个 objc 的依赖管理工具,而其本身是利用 ruby 的依赖管理 gem 进行构建的。
CocoaPods的核心组件
- CocoaPods/CocoaPod
这是是一个面向用户的组件,每当执行一个pod命令时,这个组件都将被激活。该组件包括了所有使用 CocoaPods 涉及到的功能,并且还能通过调用所有其它的 gems 来执行任务。 - CocoaPods/Core
Core 组件提供支持与 CocoaPods 相关文件的处理,文件主要是 Podfile 和 podspecs。 - Podfile
Podfile 是一个文件,用于定义项目所需要使用的第三方库。该文件支持高度定制,你可以根据个人喜好对其做出定制。更多相关信息,请查阅Podfile 指南。 - CocoaPods/Xcodeproj
这个 gem 组件负责所有工程文件的整合。它能够对创建并修改.xcodeproj和.xcworkspace文件。它也可以作为单独的一个 gem 包使用。如果你想要写一个脚本来方便的修改工程文件,那么可以使用这个 gem。 - Podfile.lock
这是 CocoaPods 创建的最重要的文件之一。它记录了需要被安装的 pod 的每个已安装的版本。如果你想知道已安装的 pod 是哪个版本,可以查看这个文件。推荐将 Podfile.lock 文件加入到版本控制中,这有助于整个团队的一致性。 - Manifest.lock
这是每次运行pod install命令时创建的Podfile.lock文件的副本。如果你遇见过这样的错误沙盒文件与 Podfile.lock 文件不同步 (The sandbox is not in sync with the Podfile.lock),这是因为 Manifest.lock 文件和Podfile.lock文件不一致所引起。由于Pods所在的目录并不总在版本控制之下,这样可以保证开发者运行 app 之前都能更新他们的 pods,否则 app 可能会 crash,或者在一些不太明显的地方编译失败。 - xcproj
如果你已经依照我们的建议在系统上安装了xcproj,它会对Pods.xcodeproj文件执行一下touch以将其转换成为旧的 ASCII plist 格式的文件。为什么要这么做呢?虽然在很久以前就不被其它软件支持了,但是 Xcode 仍然依赖于这种格式。如果没有 xcproj,你的Pods.xcodeproj文件将会以 XML 格式的 plist 文件存储,当你用 Xcode 打开它时,它会被改写,并造成大量的文件改动。 -
Podspec
本篇重点
.podspec也是一个文件,该文件描述了一个库是怎样被添加到工程中的。它支持的功能有:列出源文件、framework、编译选项和某个库所需要的依赖等。
如何下载资源文件?
-
pod install
当我们新建一个Podfile文件运行后,会自动生成一个Podfile.lock文件,Podfile.lock文件里存储着我们已经安装的依赖库(pods)的版本。
当我们第一次运行Podfile时,如果对依赖库不指定版本的话,cocoapods会安装最新的版本,同时将pods的版本记录在Podfile.lock文件中。这个文件会保持对每个pod已安装版本的跟踪,并且锁定这些版本。
再执行pod install的话,只会处理没有记录在Podfile.lock中的依赖库,会查找匹配Podfile中描述的版本。对于已经记录在Podfile.lock的依赖库,会下载Podfile.lock文件中记录的版本,而不会检查是否有更新。当然,如果你约束了pods的版本的话,会按照你指定的版本进行安装,同时也会更新Podfile.lock记录的信息。
简单的说:使用pod install在你的工程里安装新的pods。尽管你已经有了一个Podfile并且之前运行过pod install;尽管你只是在已经使用了CocoaPods的工程中添加/移除了pod,你都要使用pod instal -
pod outdated
检查记录在Podfile.lock文件中的pod版本更新情况。
当你运行pod outdated命令,CocoaPods会列出所有有新版本的pods,新版本是指比记录在Podfile.lock文件中的版本(即当前每个pod安装的版本)更新的版本。这意味着如果你对这些pod运行pod update PODNAME,它们将会更新。 -
pod update
推荐用法:pod update 要更新库的名字
当你运行pod update PODNAME命令,CocoaPods将会尝试找到PODNAME指定pod的更新版本,而不会顾及Podfile.lock文件中记录的版本。它将会更新pod的最新可用版本.如果你运行pod update而不带pod名称,CocoaPods将会更新Podfile文件中记录的每一个pod到最新可用版本.
简单的说:只有在你想要更新pods到新的版本时才使用pod update [PODNAME]
-
更新缓慢 ?
最近使用CocoaPods来添加第三方类库,无论是执行pod install
还是pod update
都卡在了Analyzing dependencies
不动. 原因在于当执行以上两个命令的时候会升级CocoaPods的spec仓库,加一个参数可以省略这一步,然后速度就会提升不少。加参数的命令如下:
pod install --verbose --no-repo-update
pod update --verbose --no-repo-update
但这样处理,我额外发现了一个弊端:
就是当你搜索一个库时,往往搜出来不是最新的版本.请自行更新。
--no-repo-update
不更新本地的仓库,直接更新源。
--verbose
输出详细日志信息 -
明明线上有这个库,但是
pod search podName
却搜索不到?
open ~/Library/Caches/CocoaPods
删除该目录下的search_index.json
文件。
本地会保存一个repo镜像,search操作只是为了方便会到本地去检索,对应的应该会有个策略,看起来应该就是缓存里这个plist了,以后如果repos更新了,plist里面没有更新,那么就会有问题了。
podspec文件
请移步至 CocoaPods-podspec
发布公有库
发布私有库
网友评论