Cocoapods使用心得

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文件,并在文件指定需要的依赖库

  1. 使用终端打开工程目录:
$ cd  项目目录
  1. 创建Podfile文件,执行
 $ pod init

该命令会创建一个podfile模版文件。
如果不想使用模版文件,也可自行创建:

//创建文件podfile
 $ touch Podfile
//编辑文件内容
$ vim Podfile
  1. 在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下载逻辑
  • pod setup会将远程索引库copy到本地。
  • 使用 pod 下载源码时,根据远程索引库内相应的索引文件.podspec记录的源码地址和版本号下载相应的版本的源码。
  • pod search ‘name’ 是在本地而非远程的索引库里根据这个key(也就是name)来找到这个索引文件,本地没有下载过,则找不到。

添加pod的幕后

  1. 创建或更新工作区workspace
  2. 将项目project添加到工作区
  3. 将CocoaPods static library添加到工作空间。
  4. 将libPods.a添加到:targets => build phases =>Link Binary With Libraries
  5. 将CocoaPods Xcode配置文件添加到应用程序的项目project中。
  6. 将应用程序的目标配置更改为基于CocoaPods。
  7. 添加 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内容的配置

  1. 使用逻辑运算符
  • '> 0.1'任何高于0.1的版本
  • '> = 0.1'版本0.1和更高版本
  • '<0.1'任何低于0.1的版本
  • '<= 0.1'版本0.1和任何较低版本
  1. 运算符~>
  • '〜> 0.1.2'版本0.1.2和版本高达0.2,不包括0.2和更高
  • '〜> 0.1'版本0.1和版本高达1.0,不包括1.0和更高版本
  • '〜> 0'版本0及更高版本,这基本上与没有版本相同
  1. 还可以使用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
107FA6BE-D61A-430F-A797-0C7114102384.png

被拷贝到本地了

三、创建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 installpod 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 文件里的版号一致:

062EF650-3108-4A13-AE22-07CEFFAB3164.png

$ 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文件,需要删除

    AA4A43E7-9BF5-450A-94C2-6B4FB39C834D.png

  • 编辑.podspec文件时注意地址:
    9C75972B-520A-48AF-B2E9-F2684333F96A.png
  • 命令格式不同:
    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 插件进行组件化私有库的创建

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,133评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,682评论 3 390
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,784评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,508评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,603评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,607评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,604评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,359评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,805评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,121评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,280评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,959评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,588评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,206评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,193评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,144评论 2 352

推荐阅读更多精彩内容