CocoaPods 大概是 2011 年出现的开源组件管理工具(目前已支持 Objective-C 和 Swift),近年来普及率越来越高,几乎已是所有 Cocoa 开源项目的标配。另外,很多大点的团队会用 CocoaPods 拆分工程,实现项目插件化。

博主曾在 2014 年写过 CocoaPods 详解 系列文章:CocoaPods详解之——使用篇CocoaPods详解之——进阶篇CocoaPods详解之——制作篇,简单介绍了从使用到亲手制作 CocoaPods 开源组件的过程。

然而随着时间的推移,CocoaPods 有些使用方式也发生了变化,比如组件提交方式等。本文将从 Trunk 和私有仓库两个方面介绍自己对 CocoaPods 的新认识。

一、Trunk 方式提交开源组件

从 CocoaPods 0.33 版本开始,CocoaPods 将组件的提交从 Pull requests 变成了自动化的 Trunk 方式。Trunk 提交方式有以下步骤:

1、向 Trunk 注册自己的电脑

首次使用 Trunk 时,需要注册自己的电脑:

1
2
# pod trunk register [E-mail] [User Name]
$ pod trunk register foggry@foggry.com "foggry"

执行命令以后,上述邮箱会收到一封验证邮件,按照邮件说明打开制定的链接,注册流程就完成了。

注册流程完成后,可以使用命令:

1
$ pod trunk me

可以检验注册结果,如果输出:

1
2
3
4
5
6
- Name:     foggry
- Email: foggry@foggry.com
- Since: May 19th, 2014 16:03
- Pods: None
- Sessions:
- March 19th, 22:23 - July 25th, 22:26. IP: 10.1.1.1

则说明注册成功。

2、提交组件

准备好 podspec 文件后,首先要检查其合法性:

1
2
# Enter podspec path
$ pod lib lint

解决完错误和警告后,会显示以下内容:

1
2
3
-> FGMarqueeView (1.0.0)

FGMarqueeView passed validation.

这就说明验证可以提交了。

执行提交命令:

1
$ pod trunk push WZMarqueeView.podspec

如果顺利的话,会输出以下内容:

1
2
3
4
5
6
7
8
9
10
11
Updating spec repo `master`

Validating podspec
-> WZMarqueeView (2.0.0) Updating spec repo `master` - Data URL: https://raw.githubusercontent.com/CocoaPods/Specs/1f2d70d978843a29cbe17b2476ffed8204eea6ef/Specs/WZMarqueeView/2.0.0/WZMarqueeView.podspec.json
- Log messages:
- March 21st, 00:49: Push for `WZMarqueeView 2.0.0' initiated.
- March 21st, 00:49: Push for `WZMarqueeView 2.0.0' has been pushed (2.327208585 s).

仅需要这一条命令,开源组件就被推送到 CocoaPods 主仓库中了。可以执行以下命令验证下:

1
$ pod search WZMarqueeView

输出为:

1
2
3
4
5
6
-> WZMarqueeView (2.0.0)
A marquee view used on iOS.
pod 'WZMarqueeView', '~> 2.0.0'
- Homepage: https://github.com/wangzz/WZMarqueeView
- Source: https://github.com/wangzz/WZMarqueeView.git
- Versions: 2.0.0, 1.0.0 [master repo]

说明组件 WZMarqueeView 已经成功从 1.0.0 升级成了 2.0.0 版本。

3、其它说明

  • 权限声明

在执行下述命令时:

1
$ pod trunk push WZMarqueeView.podspec

提示了以下错误:

1
2
3
4
5
6
Updating spec repo `master`

Validating podspec
-> WZMarqueeView (2.0.0) [!] You are not allowed to push new versions for this pod.

原来,Trunk 要求只有组件所有者和开发者才能更新已有组件,而上例的组件 WZMarqueeView 是 2014 年通过 Pull requests 方式上传到 CocoaPods 主仓库的,并没有声明过所有权。

随后,到 CocoaPods 指定的网页:Claim your Pod上填写对应信息后,按照提示执行命令:

1
$ pod trunk info WZMarqueeView

看到执行结果:

1
2
3
4
5
WZMarqueeView
- Versions:
- 1.0.0 (2014-05-19 22:03:59 UTC)
- Owners:
- foggry <foggry@foggry.com>

组件的所有权已经变成了本人,此时再去执行 trunk push 命令时就正常了。

  • 为组件添加其它所有者

一个组件可以通过以下命令,添加多个所有者(以邮箱为标识):

1
2
# pod trunk add-owner [Module Name] [Owner E-mail]
$ pod trunk add-owner WZMarqueeView kyle@cocoapods.org

执行成功后,kyle@cocoapods.org 也变成了 WZMarqueeView 的所有者。

  • Pull requests 和 Trunk 对比

对于开发者来说,Pull requests 的操作过程十分繁琐,需要开源组件制作者先 fork 一份主仓库,然后将组件提交到 fork 后的仓库,再 Pull requests 给 CocoaPods 主仓库的维护者;

对 CocoaPods 主仓库的维护者来说,需要手工一个个处理主仓库的合并操作,通常第二天甚至需要更长时间 requests 才能被处理;

而 Trunk 方式,开发者只需要一条命令就能将组件上传到主仓库,并且 Trunk 方式是自动化的,几乎不再需要主仓库的维护者做任何工作,实时性更好。

另外,Trunk 增加了组件所有者的概念,非所有者无法提交组件的更新,这在一定程度上提高了 CocoaPods 的安全性。

二、创建私有 CocoaPods 仓库

目前所有支持 CocoaPods 的开源组件,都存储在 Github 上公共的 CocoaPods Specs 仓库中,这种方式有以下缺点:

官方仓库过大,里面的绝大多数组件都不是我们需要的,你一定忘不了首次执行 pod install 操作时那无尽的等待;

不能实现私有化,作为一个相当好用的组件管理工具,很多团队都使用 CocoaPods 实现庞大项目的组件化,都放在公共仓库肯定不行。

这时就需要创建一个和 CocoaPods Specs 类似的私有组件存储仓库。私有仓库可以存放在自家公司的 Git 服务器上,也可以放在各大支持私有仓库的 Git 平台上,下面以支持免费私有仓库的 coding.net为例说明 CocoaPods 私有仓库的创建过程。

1、创建coding.net私有仓库

按照 coding.net 官网提示创建一个私有仓库即可。

2、本地初始化组件仓库

执行以下命令:

1
2
# pod repo add [Private Repo Name] [GitHub HTTPS clone URL]
$ pod repo add FGSpecs https://git.coding.net/foogry/FGSpecs.git

3、向仓库中添加组件

将事先准备好的组件添加到仓库中,组件可以存放在本地,也可以放在自家或网上的代码托管平台。执行以下命令:

1
2
# pod repo push [Private Repo Name] [Private podspec Path]
$ pod repo push FGSpecs ~/Desktop/FGMarqueeView.podspec

执行成功以后,会有以下输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Validating spec

-> FGMarqueeView (0.1.0)

Updating the `FGSpecs' repo

Already up-to-date.

Adding the spec to the `FGSpecs' repo

- [Fix] FGMarqueeView (0.1.0)

Pushing the `FGSpecs' repo

To git@git.coding.net:foogry/FGSpecs.git
e2ad499..31a1a8e master -> master

至此,本地和代码托管平台上的私有仓库 FGSpecs 中就都已经添加了私有组件 FGMarqueeView。

4、使用私有仓库中的组件

Podfile 文件中默认情况下已经隐式使用 source 声明了 CocoaPods 的官方仓库。但使用私有组件,需要使用 source 关键字鲜显式声明组件所在仓库:

1
2
3
4
5
6
7
8
# Private Specs
source 'https://git.coding.net/foogry/FGSpecs.git' # Public Specs
source 'https://github.com/CocoaPods/Specs.git' pod 'FGMarqueeView', '~> 0.1.0'
pod 'SBJson', '~> 4.0.0'

其中,SBJson 组件是官方仓库的,FGMarqueeView 组件属于我们刚创建的私有仓库。

需要注意的是:

  • 官方仓库的显式声明

尽管官方仓库会被隐式声明,如果同时使用了官方仓库和私有仓库,就需要同时声明二者。

  • 仓库声明顺序性

先声明的仓库具有优先权。当先后引用的两个仓库中都包含同一个组件时,会使用先引用仓库中的,哪怕后引用的仓库中版本号更高。

5、直接使用私有组件

如果不想创建私有仓库,也可以在 Podfile 里直接引用私有组件(组件可以是本地的,也可以是托管在自家公司服务器或网上的代码托管平台上的),引用的同时还可以制定具体的 commit、branch 或者 tag,比如:

1
$ pod 'FGMarqueeView', :git => 'https://git.coding.net/foogry/FGMarqueeView.git', :commit => 'b4dc0ffee'

这种方式引用的组件在执行完 pod install 以后,会被添加在 Development Pods 目录下,而通过私有仓库或共有仓库方式引用的组件则会被添加在 Pods 目录下。

三、cocoapods 版本管理

cocoapods 升级新版本后可能会遇到坑,因此就有了降级的需求。

  • 查看当前版本
1
sudo gem list cocoapods
  • 卸载当前版本
1
sudo gem uninstall cocoapods
  • 安装指定版本
1
sudo gem install cocoapods -v 0.39.0

四、参考文档

转自:http://foggry.com/blog/2016/03/23/cocoapods-xiang-jie-zhi-geng-xin-pian/

CocoaPods 详解之----更新篇的更多相关文章

  1. CocoaPods详解之(三)----制作篇

    CocoaPods详解之----制作篇 作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/20067595 转载请注明出处 ...

  2. CocoaPods详解之(一)----使用篇

    CocoaPods详解之----使用篇 作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/18737437 一.什么是Coc ...

  3. CocoaPods详解之(二)----进阶篇

    CocoaPods详解之----进阶篇 作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/19178709 转载请注明出处 ...

  4. [HMLY]4.CocoaPods详解----制作

    作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/20067595 转载请注明出处   学会使用别人的pods依赖库后,你一 ...

  5. [HMLY]1.CocoaPods详解----使用

    作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/18737437 转载请注明出处   一.什么是cocoaPods 1.为 ...

  6. CocoaPods详解之----制作篇【转】

    Cocoapods是非常好用的一个iOS依赖管理工具,使用它可以方便的管理和更新项目中所使用到的第三方库,以及将自己的项目中的公共组件交由它去管理.Cocoapods的介绍及优点本文就不在赘述,我开始 ...

  7. Cocoa包管理器之CocoaPods详解

    CocoaPods在Cocoa开发日常工作中经常用到的包管理器,即依赖管理工具.有的项目也有用Carthage的,Carthage是一个比较新的依赖管理工具,是使用Swift语言开发的.Carthag ...

  8. CocoaPods详解之----使用篇

    http://blog.csdn.net/meegomeego/article/details/24005567 作者:wangzz 原文地址:http://blog.csdn.net/wzzvict ...

  9. iOS:CocoaPods详解

    原文地址:http://blog.csdn.net/wzzvictory/article/details/18737437 一.什么是CocoaPods 1.为什么需要CocoaPods 在进行iOS ...

随机推荐

  1. php imagick 文字居中的方法

    php imagick 文字居中的方法<pre> public function getwenzinfo($nickName) { $nickNamelen = mb_strlen($ni ...

  2. China .NET Conf 2019-.NET技术架构下的混沌工程实践

    这个月的8号.9号,个人很荣幸参加了China.NET Conf 2019 , 中国.NET开发者峰会,同时分享了技术专题<.NET技术架构下的混沌工程实践>,给广大的.NET开发小伙伴介 ...

  3. 多线程之美1一volatile

    目录 一.java内存模型 1.1.抽象结构图 1.2.概念介绍 二.volatile详解 2.1.概念 2.2.保证内存可见性 2.3.不保证原子性 2.4.有序性 一.java内存模型 1.1.抽 ...

  4. 爬虫实践--CBA历年比赛数据

    闲来无聊,刚好有个朋友来问爬虫的事情,说起来了CBA这两年的比赛数据,做个分析,再来个大数据啥的.来了兴趣,果然搞起来,下面分享一下爬虫的思路. 1.选取数据源 这里我并不懂CBA,数据源选的是国内某 ...

  5. 一个简单的C#爬虫程序

    这篇这篇文章主要是展示了一个C#语言如何抓取网站中的图片.实现原理就是基于http请求.C#给我们提供了HttpWebRequest和WebClient两个对象,方便发送请求获取数据,下面看如何实 1 ...

  6. asp.net core 自定义 Policy 替换 AllowAnonymous 的行为

    asp.net core 自定义 Policy 替换 AllowAnonymous 的行为 Intro 最近对我们的服务进行了改造,原本内部服务在内部可以匿名调用,现在增加了限制,通过 identit ...

  7. webpack安装与核心概念

    安装webpack webpack核心概念:入口.输出.加载器.插件.模块.模式 一.安装webpack 1.安装webpack之前需要安装nodejs环境,在使用nodejs环境自带的包管理工具np ...

  8. Running serveral https server on a single IP address

    Nginx 在一个IP上配置多个https server时,默认只会发送默认server name的证书.这是由ssl 协议本身行为导致的:先建立ssl connection,后发送http请求.即n ...

  9. PHP创建对象的6种方式

    创建对象实例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 ...

  10. 面向对象之classmethod和staticmethod(python内置装饰器)

    对象的绑定方法复习classmethodstaticmethod TOC 对象的绑定方法复习 由对象来调用 会将对象当做第一个参数传入 若对象的绑定方法中还有其他参数,会一并传入 classmetho ...