Cocoapods
CocoaPods管理Xcode项目的依赖库。项目的依赖库在名为 Podfile 的文本文件中指定。CocoaPods将解析库之间的依赖关系
,获取生成的源代码,然后在Xcode工作区中将它们链接在一起以构建项目。
最终目标
是通过创建更加集中的生态系统来提高第三方开源库的可发现性、参与度、易管理、易维护。
安装CocoaPods
CocoaPods由Ruby构建的,它可以使用macOS上的默认Ruby进行安装。(如果你熟悉的话,可以使用Ruby管理器。推荐使用默认的Ruby安装,使用默认的Ruby安装需要使用 sudo
管理员授权)
$ gem install cocoapods
或 $ sudo gem install -n /usr/local/bin cocoapods
如果无法获取下载源,则安装之前需要先切换Ruby默认的软件源,因为rubygems.org被屏蔽了
//查看ruby下载源
$ gem sources -l
//切换源(添加新的源,并移除旧的源)
$ gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/
cocoapods本地库下载
$ pod setup
使用CocoaPods
为项目工程添加依赖库pod
安装Cocoapods成功后,为需要的项目创建 Podfile文件,并在文件指定需要的依赖库
- 使用终端打开工程目录:
$ cd 项目目录
- 创建
Podfile
文件,执行
$ pod init
该命令会创建一个podfile模版文件。
如果不想使用模版文件,也可自行创建:
//创建文件podfile
$ touch Podfile
//编辑文件内容
$ vim Podfile
- 在podfile文件中指定链接的目标工程和依赖库,以及项目指定适配的最小的系统版本
例如:
platform :ios, '9.0' //项目支持的最低iOS版本
target 'MyAppName输入项目名称' do
pod 'ObjectiveSugar'
end
4)修改保存podfile后,执行以下命令,下载依赖库
$ pod install
运行成功后工程文件下会生成一个Podfile.lock
文件,以及工程和依赖库的链接执行.xcworkspace
文件
Podfile.lock 文件是项目第一次安装pod后生成的,此文件跟踪各个pod已安装版本并锁定这些版本
。
pod update
同样可以根据Podfile
下载依赖库,它与pod install
区别如下:
Pod install VS pod update
Pod install:
- project第一次下载三方pod时使用(
即未生成 podfile.lock文件
),它参照 podfile文件,下载指定版本的依赖库(未指定版本则下载最新版本),生成podfile.lock文件并记录锁定依赖库的名称和版本号 - 项目中已存在 podfile.lock文件时,对于podfile.lock中记录的pods,pod install 下载记录的版本pod,未记录在podfile.lock中的pods则下载最新版本的,并记录在podfile.lock文件中。
Pod update:
不考虑 podfile.lock文件锁定的版本号,仅仅参照podfile文件,下载podfile文件指定版本的依赖库(未指定版本则下载最新版本),并记录在podfile.lock文件中
它是确保每个团队成员使用相同版本pods的唯一方法
。
下载三方依赖库Pod的逻辑:
- pod setup会将
远程索引库
copy到本地。 - 使用 pod 下载源码时,根据远程索引库内相应的
索引文件.podspec
记录的源码地址和版本号下载相应的版本的源码。 -
pod search ‘name’
是在本地而非远程的索引库里根据这个key(也就是name)来找到这个索引文件,本地没有下载过,则找不到。
添加pod的幕后
- 创建或更新工作区workspace。
- 将项目project添加到工作区
- 将CocoaPods static library添加到工作空间。
- 将libPods.a添加到:targets => build phases =>Link Binary With Libraries
- 将CocoaPods Xcode配置文件添加到应用程序的项目project中。
- 将应用程序的目标配置更改为基于CocoaPods。
- 添加 build phase 以将资源从您安装的任何pods复制到应用程序包。
即在所有其他构建阶段之后的“Script build phase(脚本构建阶段)”,具有以下内容:
- Shell:/ bin / sh
- Script:$ {SRCROOT} /Pods/PodsResources.sh
注意:
如果CocoaPods static library已经在您的项目中,则跳过步骤 3 以后的步骤。这在很大程度上基于乔纳威廉姆斯关于Static Library。
是否将pods目录检查添加到源代码管理?
是否添加pods到源代码管理中各有优略,最终取决你的需求
检查Pods目录的好处:
- 克隆了储存库repo后,即使没有在机器上安装CocoaPods,项目也可以立即构建和运行。无需运行pod安装,也无需网络连接
- Pod(代码/库)始终可用,即使Pod的源(例如GitHub)要关闭也是如此。
- 在cloning repo后,Pod工件保证与原始安装中的Pod相同。
忽略Pods目录的好处:
- 源控件仓库repo将更小并占用更少的空间。
- 只要所有Pod的源(例如GitHub)可用,CocoaPods通常能够重新创建相同的安装。(从技术上讲,无法保证在Podfile中不使用提交SHA时,运行pod安装将获取并重新创建相同的工件。在Podfile中使用zip文件时尤其如此。)
-执行source control时不会有任何冲突,例如合并具有不同Pod版本的分支
注意:无论您是否检查Pods目录,Podfile和Podfile.lock应始终保持在版本控制之下,保证团队协调合作同一项目的保证。
Podfile内容的配置
- 使用
逻辑运算符
- '> 0.1'任何高于0.1的版本
- '> = 0.1'版本0.1和更高版本
- '<0.1'任何低于0.1的版本
- '<= 0.1'版本0.1和任何较低版本
- 运算符
~>
- '〜> 0.1.2'版本0.1.2和版本高达0.2,不包括0.2和更高
- '〜> 0.1'版本0.1和版本高达1.0,不包括1.0和更高版本
- '〜> 0'版本0及更高版本,这基本上与没有版本相同
- 还可以使用Pod的最新版本、特定版本或分支版本。使用pod声明指定:
- 使用主分支:
pod 'Alamofire', :git => 'https://github.com/Alamofire/Alamofire.git'
- 使用repo不同分支:
pod 'Alamofire', :git => 'https://github.com/Alamofire/Alamofire.git', :branch => 'dev'
- 使用repo的tag版本:
pod 'Alamofire', :git => 'https://github.com/Alamofire/Alamofire.git', :tag => '3.1.1'
- 指定一个提交:
搭建pod
一、外部前提条件:
一个用于存储 Pod Project文件 的远程仓库
一个用于存储 Spec Repo (索引文件)的远程仓库
可以在GitHub、Gitlab、SVN等上创建:
这里用github作为例子,如何在github上创建新仓库网上有很多资料,github上也有指导:Create a repo
二、创建本地私有仓库,并添加到CocoaPods安装(如果打算使用cocoapods公有的索引仓库则可跳过该步骤)**
打开cocoapods目录:~/.cocoapods/repos
[图片上传中...(B076DAF3-4A26-4F11-AED2-C08BDF6269A4.png-4d3a0-1545639728774-0)]
执行以下命令,创建本地私有库:
$ pod repo add NAME URL
可见远程仓库 WYSpecRepo
被拷贝到本地了
三、创建pod project
打开项目要存放的文件夹cd 文件夹
,执行下面的命令
$ pod lib create MylibraryName
或pod lib create ProjectName --template-url=https://github.com/CocoaPods/pod-template.git
不填写模版路径时,默认为git上的默认版本
(pod lib create
通过提供标准目录结构以及高质量pod所需的一堆样板文件来帮助您快速入门。pod lib create不是创建pod的唯一方法,但它是最简单的方法。关于pod lib create 具体做了什么可以参考这里理解CocoaPods的Pod Lib Create
创建后项目目录如下:
其中,
Classes
:文件夹:存放核心文件(如类文件),并删除ReplaceMe.m
Assets
:存放资源文件(如图片)
注意:当您将新/现有文件添加到 Classes或 Assets或更新podspec时,您应该运行
pod install
或pod update
。
四、对项目中的.podspec 文件,进行编辑:
Pod::Spec.new do |s|
s.summary = "XXX" 改成你的仓库名就行了
s.description = "pod的详细描述,要注意比s.summary的描述要长"
// s.description = <<-DESC
//TMManager的详细描述,要注意比s.summary的描述要长//要么这样写(不能合到一//行),要么和上面的一样DESC
s.homepage = "[https://github.com/xxx/xxx.git](https://github.com/xxx/xxx.git)" 改成你github的仓库地址就行了
s.license = { :type => "MIT", :file => "LICENSE" }
s.author = { "name" => “邮箱” }改成你的名字和邮箱
s.source = { :git => 'https://github.com/xxx/远程仓库地址', :tag => s.version.to_s }
# s.exclude_files = "Classes/Exclude” 注释掉
s.source_files = "Demo", "Demo/**/*.{h,m}" //和.podspec 写同级文件夹名字
s.platform = :ios s.platform = :ios, "8.0"//指定最小支持系统
#s.requires_arc = true //是否使用ARC
s.frameworks = 'Foundation', 'CoreGraphics', 'UIKit' //使用框架
s.dependency 'SDWebImage' // 依赖库
End
修改完成后终端打开到.podspec文件所在目录下,验证podspec文件
//进行本地验证文件有效性
$ pod lib lint yourPodName.podspec
例如:五、上传项目工程文件到远程库
// 关联本地项目与远程仓库,并上传项目文件:
//添加远程仓库地址
$ git remote add origin [repo_url]
//将本地主分支推到远程(如无远程主分支则创建,用于初始化远程仓库
$ git push -u origin master
至此,项目工程文件就成功上传到远程项目代码仓库
六、实现 pod 命令下载
tag标签
打上tag值上传:注意tag必须与 .podspec 文件里的版号一致:
$ git tag -m "描述" -a [版本号] 或者 $ git tag [版本号]
$ git push --tag
校验
//对本地和远程验证文件和相关tag,需要能够访问到远程仓库
$ pod sepc lint xxx.podspec
注意!如果私有库中以来了其他 pod,需要说明来源,提交命令用下面这个:
$ pod sepc lint xxx.podspec --source=url,url……
向远程 spec repo(索引文件仓库)提交 podspec(索引文件),使我们自己的 pod 可获取
主要有两种:私有远程索引仓库
和 公开的远程索引仓库
- 公开的索引仓库(实际为cocoapod的master仓库):
$ pod trunk push [xx.podspec]
- 私有的索引仓库(自己创建的远程索引仓库):
$ pod repo push [sepcRepoName] [xx.podspec]
// 如果私有库中以来了其他 pod,需要说明来源,提交命令用下面这个:
$ pod repo push [sepcRepoName] [xx.podspec] --source=url,url……
提交成功后,远程索引仓库和本地仓库能够同时观察到相应版本的索引文件.
此时:就可以在其他项目的Podfile 文件中使用
pod 'libName'
向项目中导入我们自己创建的私有pod`
基于 svn 服务器搭建私有库
以组件化的形式,将需要的组件以pod私有库的形式安装到最后的主工程中,组件间各自独立、解耦,仅依赖中间件进行通信,这或许就是极好的架构形式。
插件支持
cocoapods-repo-svn
:cocoapods提供了对SVN服务器的支持,为svn创建并管理pod提供的插件
执行以下命令安装插件:
$ sudo gem install cocoapods-repo-svn
创建私有pod
基于svn使用pod的过程与基于github的非常相似,只有些许的不同点:
-
执行
pod lib create libraryName
后,由于是github上的默认版本,所以会在项目文件目录下生成git文件,需要删除
-
编辑.podspec文件时注意地址:
命令格式不同:
SVN:
//校验podspec和tag
$ pod repo-svn lint [xxx.podspec]
//提交索引文件到远程索引仓库
$ pod repo-svn push [sepcRepoName] [xx.podspec]
【注意】:基于svn的pod的依赖库如果如果包含了同样依赖了svn的私有库,则在使用pod命令下载依赖库时会报错,因为目前cocoapods对库的依赖库的查找地址默认情况下为git,所以对于这种情况的pod的索引文件目前只能放置在git上
参考:
Cocoapods
Creating Your First CocoaPod
基于 svn 服务器及 cocoapods-repo-svn 插件进行组件化私有库的创建用