以前只会pod install....
有必要搞清楚cocoaPods到底在干嘛。
CocoaPods是开发 OS X 和 iOS 应用程序的一个第三方库的依赖管理工具。利用CocoaPods,可以定义自己的依赖关系(称作pods)。
cocoaPods为我们做了两件事:
1>在工程中引入第三方代码会涉及到的工程文件的配置,build phases和linker flags,它能自动配置编译选项。
2>通过CocoaPods,可以很方便的查找到新的第三方库。
CocoaPods是一个objc的依赖管理工具,而其本身是利用ruby的依赖管理gem进行构建的。
Cocoapods是用ruby写的,并由若干个ruby包(gems)构成的。在解析整合过程中,最重要的几个gems分别是:
CocoaPods/CocoaPods ,
CocoaPods/Core,
CocoaPods/Xcodeproj
分别看下这几个gems干了什么事儿
CocoaPods/CocoaPods
这是一个面向用户的组件,每当执行一个pod命令时,这个组件都将被激活。该组件包括了所有使用CocoaPods涉及到的功能,并且还能通过调用所有其他的gems来执行任务。
CocoaPods/Core
Core组件提供支持与CocoaPods相关文件的处理,文件主要是Podfile和podspecs。
podfile:是一个文件,用于定义项目所需要使用的第三方库。该文件支持高度定制。
podspec:.podspec也是一个文件,该文件描述了一个库是怎样被添加到工程中的。它支持的功能有:列出源文件、framework、编译选项和某个库所需要的依赖等。
CocoaPods的安装
MAC下自带ruby,使用ruby的gem命令即可下载安装:
sudo gem install cocoapods
pod setup
如果gem比较老,可以试试升级gem:
sudo gem update --system
另外,ruby的软件源 https://rubygems.org 因为使用的是亚马逊的云服务,所以被墙了,需要更新一下ruby的源,将官方的ruby源替换成国内淘宝的源:
gem sources --remove https://rubygems.org/
gem sources -a https://ruby.taobao.org/
gem sources -l
CocoaPods的镜像索引
所有的项目的Podspec文件都托管在https://github.com/CocoaPods/Specs。第一次执行pod setup时,CocoaPods会将这些podspec索引文件更新到本地的~/.cocoapods/目录下,这个索引文件比较大,有80M左右,所以第一次更新时非常慢。
使用CocoaPods
使用时需要新建一个名为Podfile的文件,以如下格式,将依赖的库名字写在该文件中:
platform :ios
pod 'JSONKit', '~> 1.4'
pod 'Reachability', '~> 3.0.0'
pod 'ASIHTTPRequest'
pod 'RegexKitLite'
然后将编辑好的Podfile文件放到你的项目根目录中,执行如下命令即可:
pod install
现在你的所有第三方库都已经下载完成并且设置好了编译参数和依赖。
关于Podfile.lock
当你执行pod install之后,除了Podfile外,CocoaPods还会生成一个名为Podfile.lock的文件,Podfile.lock应该加入到版本控制里面,不应该把这个文件加入到.gitignore中。因为Podfile.lock会锁定当前各依赖库的版本,之后如果多次执行pod install不会更改版本,要pod update才会改Podfile.lock了。这样多人协作的时候,可以防止第三方库升级时造成大家各自的第三方库版本不一致。
为自己的项目创建podspec文件:
我们可以为自己的开源项目创建podspec文件,首先通过如下命令初始化一个podspec文件:
pod spec create your_pod_spec_name
该命令执行之后,CocoaPods会生成一个名为your_pod_spec_name.podspec的文件,然后我们修改其中的相关内容即可。
如何编写一个CocoaPods的spec文件
为自己的项目编写Podspec文件:
初始化一个Podspec文件:
pod spec create weibo_ios_sdk_sso-oauth
该命令将在本目录产生一个名为weibo_ios_sdk_sso-oauth.podspec的文件。
如何声明第三方库的代码目录和资源目录,还有该第三方库所依赖iOS核心框架和第三方库?
podspec文件大致如下:
Pod::Spec.new do |s|
s.name = 'ADVProgressBar' //声明库的名称。pod search命令就是根据s.name 和 s.summary作为搜索文本的
s.version = '0.0.1' //声明库源代码的版本
s.license = 'MIT' //采取的授权版本
s.summary = 'Progress Bar Design with Percentage values.' //声明一个简短的说明文档
s.homepage = 'https://github.com/appdesignvault' //声明库的主页
s.author = { 'appdesignvault' => 'appdesignvault' } //库的作者
s.source = { :git => 'https://github.com/appdesignvault/ADVProgressBar.git', :commit => 'f17b15c15574d6d101cd5fcfd58239e16e806647' } //声明源代码的地址。对于很多第三方库而言,在发布的时候都会打上一个tag,如版本0.0.1就会打上一个名为v0.0.1的tag,但是但是weibo_ios_sdk_sso-oauth库还未打上任何tag,我们可以选择一个最新的commit来作为该库0.0.1版的代码。以后我们可以根据该库不同的版本创建相应的pod spec文件。
s.platform = :ios
s.source_files = 'ADVProgressBar/Classes/*.{h,m}'
s.resources = "ADVProgressBar/Resources/*.png"
s.framework = 'UIKit'
s.requires_arc = true
end
weibo_ios_sdk_sso-oauth的目录结构:
demo目录保存一个示例项目,src才是库的源代码目录。src的目录结构如下:
JSONKit目录说明这个库本身依赖于JSONKit第三方库。我们可以在podspec文件中的s.dependency声明段中声明。
s.dependency 'JSONKit', '~>1.4'
SinaWeibo目录才是包含了所有源代码的目录,我们需要在s.source_files中声明
s.source_files = 'src/SinaWeibo/.{h,m}'
前一部分src/SinaWeibo/是一个相对目录,目录的层级关系一定要跟代码库的保持一致。最后一部分.{h,m}是一个类似正则表达式的字符串,表示匹配所有以.h和.m为扩展名的文件。
src/SinWeibo/目录下还有一个SinaWeibo.bundle目录,该目录存放一些资源文件(如图片等),这些文件并不需要进行编译。可以使用s.resources声明:
s.resources = "src/SinaWeibo/SinaWeibo.bundle//.png"
前一部分跟上面相同,表示匹配所有子目录,.png表示所有以.png为扩展名的图片文件。
weibo_ios_sdk_sso-oauth还依赖一个iOS的核心库QuartzCore
s.framework = 'QuartzCore'
最终结果如下:
Pod::Spec.new do |s|
s.name = "weibo_ios_sdk_sso-oauth"
s.version = "0.0.1"
s.summary = 'weibo.com sso oauth, 微博sso认证登录功能'
s.homepage = "https://github.com/mobileresearch/weibo_ios_sdk_sso-oauth"
s.license = 'MIT'
s.author = {'mobileresearch' => 'mobileresearch'}
s.source = { :git => 'https://github.com/mobileresearch/weibo_ios_sdk_sso-oauth.git', :commit => '68defea78942ecc782ffde8f8ffa747872af226d' }
s.platform = :ios
s.source_files = 'src/SinaWeibo/*.{h,m}'
s.resources = "src/SinaWeibo/SinaWeibo.bundle/**/*.png"
s.framework = 'QuartzCore'
s.dependency 'JSONKit', '~> 1.4' //
end
可以将该spec文件保存到本机的~/.cocoapods/master/目录中仅供自己使用,也可以将其提交到CocoaPods/Specs代码库中。下面是将其保存到本机中:
$ mkdir -p ~/.cocoapods/master/weibo_ios_sdk_sso-oauth/0.0.1
$ cp weibo_ios_sdk_sso-oauth.podspec ~/.cocoapods/master/weibo_ios_sdk_sso-oauth/0.0.1
使用私有的pods
我们可以直接指定某一个依赖的podspec,这样就可以使用公司的私有库。该方案有利于使企业内部的公共项目支持CocoaPods。
pod 'MyCommon', :podspec => 'https://yuantiku.com/common/myCommon.podspec'
不更新podspec
CocoaPods在执行pod install和pod update时,会默认先更新一次pod spec索引。使用--no-repo-update参数可以禁止其做索引更新操作
pod install --no-repo-update
pod update --no-repo-update
原理:
CocoaPods是将所有的依赖库都放到另一个名为Pods项目中,然后让主项目依赖Pods项目,这样,源码管理工作都从主项目移到了Pods项目中。
Pods项目最终会编译成一个名为libPods.a的文件,主项目只需要依赖这个.a问价即可。
对于资源文件,CocoaPods提供了一个名为Pods-resources.sh的bash脚本,该脚本在每次项目编译的时候都会执行,将第三方库的各种资源文件复制到目标目录中。
CocoaPods通过一个名为Pods.xcconfig的文件夹在编译时设置所有的依赖和参数。