CocoaPods 大概是 2011 年出现的开源组件管理工具(目前已支持 Objective-C 和 Swift),近年来普及率愈来愈高,几乎已经是全部 Cocoa 开源项目的标配。另外,不少大点的团队会用 CocoaPods 拆分工程,实现项目插件化。html
博主曾在 2014 年写过 CocoaPods 详解
系列文章:CocoaPods详解之——使用篇、CocoaPods详解之——进阶篇、CocoaPods详解之——制做篇,简单介绍了从使用到亲手制做 CocoaPods 开源组件的过程。git
然而随着时间的推移,CocoaPods 有些使用方式也发生了变化,好比组件提交方式等。本文将从 Trunk 和私有仓库两个方面介绍本身对 CocoaPods 的新认识。github
从 CocoaPods 0.33 版本开始,CocoaPods 将组件的提交从 Pull requests 变成了自动化的 Trunk 方式。Trunk 提交方式有如下步骤:json
首次使用 Trunk 时,须要注册本身的电脑:数组
1
2 |
# pod trunk register [E-mail] [User Name] $ pod trunk register foggry@foggry.com "foggry" |
执行命令之后,上述邮箱会收到一封验证邮件,按照邮件说明打开制定的连接,注册流程就完成了。安全
注册流程完成后,可使用命令:服务器
1
|
$ pod trunk me |
能够检验注册结果,若是输出:ide
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 |
则说明注册成功。工具
准备好 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
版本。
在执行下述命令时:
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 的操做过程十分繁琐,须要开源组件制做者先 fork 一份主仓库,而后将组件提交到 fork 后的仓库,再 Pull requests 给 CocoaPods 主仓库的维护者;
对 CocoaPods 主仓库的维护者来讲,须要手工一个个处理主仓库的合并操做,一般次日甚至须要更长时间 requests 才能被处理;
而 Trunk 方式,开发者只须要一条命令就能将组件上传到主仓库,而且 Trunk 方式是自动化的,几乎再也不须要主仓库的维护者作任何工做,实时性更好。
另外,Trunk 增长了组件全部者的概念,非全部者没法提交组件的更新,这在必定程度上提升了 CocoaPods 的安全性。
目前全部支持 CocoaPods 的开源组件,都存储在 Github 上公共的 CocoaPods Specs 仓库中,这种方式有如下缺点:
官方仓库过大,里面的绝大多数组件都不是咱们须要的,你必定忘不了首次执行 pod install
操做时那无尽的等待;
不能实现私有化,做为一个至关好用的组件管理工具,不少团队都使用 CocoaPods 实现庞大项目的组件化,都放在公共仓库确定不行。
这时就须要建立一个和 CocoaPods Specs 相似的私有组件存储仓库。私有仓库能够存放在自家公司的 Git 服务器上,也能够放在各大支持私有仓库的 Git 平台上,下面以支持免费私有仓库的 coding.net为例说明 CocoaPods 私有仓库的建立过程。
按照 coding.net 官网提示建立一个私有仓库便可。
执行如下命令:
1
2 |
# pod repo add [Private Repo Name] [GitHub HTTPS clone URL] $ pod repo add FGSpecs https://git.coding.net/foogry/FGSpecs.git |
将事先准备好的组件添加到仓库中,组件能够存放在本地,也能够放在自家或网上的代码托管平台。执行如下命令:
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。
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 组件属于咱们刚建立的私有仓库。
须要注意的是:
尽管官方仓库会被隐式声明,若是同时使用了官方仓库和私有仓库,就须要同时声明两者。
先声明的仓库具备优先权。当前后引用的两个仓库中都包含同一个组件时,会使用先引用仓库中的,哪怕后引用的仓库中版本号更高。
若是不想建立私有仓库,也能够在 Podfile 里直接引用私有组件(组件能够是本地的,也能够是托管在自家公司服务器或网上的代码托管平台上的),引用的同时还能够制定具体的 commit、branch 或者 tag,好比:
1
|
$ pod 'FGMarqueeView', :git => 'https://git.coding.net/foogry/FGMarqueeView.git', :commit => 'b4dc0ffee' |
这种方式引用的组件在执行完 pod install
之后,会被添加在 Development Pods 目录下,而经过私有仓库或共有仓库方式引用的组件则会被添加在 Pods 目录下。
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/