如何创建私有 CocoaPods 仓库

公共 CocoaPods

打开隐藏目录,可以使用命令:

//打开隐藏的命令:
defaults write com.apple.finder AppleShowAllFiles -bool true
//关闭隐藏的命令:
defaults write com.apple.finder AppleShowAllFiles -bool false

接着需要重启一下 Finder, 可以按住 option + 右键 Finder 图标选择重启。然后打开隐藏目录 .cocoapods (这个目录在你的个人目录底下, ~/.cocoapods/Users/[username]/.cocoapods)

p1

可以看到上图, .cocoapods 目录下的 repos 其实是 repository (仓库)的缩写。 repos 中存放的时仓库的集合。这里的 master 就是 CocoaPods 官方建立的仓库,也就是我们所谓的公共库。

specs 目录下存放的就是所有提交到 CocoaPods 的开源库的 podspec 文件的集合。
其结构如下图所示:

p2

其组成方式:

specName -- version -- specName.podspec

( master 里现在是 specName.podspec.json,这个 .json 文件就是 podspec 文件加了个后缀。我们可以采用 pod ipc spec 这个命令来将 spec 文件转换成 .json)

那这个文件夹是如何来得呢?其实,这个文件夹是在你安装了 CocoaPods 后,第一次执行 pod install 时, CocoaPods 通过命令 pod setup 来建立的(这条命令会自动执行)。

上述是官方的 repo ,私有库的话可以看下我们前面的翻译或者查看官方文档,但是官方文档有一些过程写的不是特别详细,自己实现的时候遇到了一些坑,特此梳理一下过程,按照官方文档内容实现一个私有的 spec repo 。根据官方的原理,我们只需要创建一个和 master 相类似结构的目录就可以实现私有的 spec repo,当然你可以 fork 一个官方的 repo,但是它包含了太多没有必要地库在里面,这在编译仓库的时候需要浪费大量的时间,所以我们只要自己重新创建一个就可以了。

1.创建一个私有的 Spec Repo

在你的 git 服务器上创建一个 repo。这里你可以在 github 或者你自己的 git 服务器上实现。公司内部使用的话这里推荐大家使用私有的仓库,但是 github 的私有仓库是要收费的 $7/month (壕请无视 - -!)。大部分公司都是有自己的git服务器,不过一般只能在公司内网使用,或者可以选择Gitlab,Coding, Bitbucket任意一种。我们以在 github 上创建为例:

p3

如图所示,我们在 github 上创建一个空的仓库,命名为 O2Specs ,这个仓库是用来存放我们自己所有的私有库的 spec 文件,就如同官方的 https://github.com/CocoaPods/Specs 是用来存放所有官方的 specs 文件一样。

然后我们就可以执行:

pod repo add REPO_NAME SOURCE_URL

其中的 REPO_NAME 是我们要添加的私有 repo 的名称(这里我们待会填的是: O2Specs),后面是仓库的 git 地址。这里做的其实是创建的工作,也就是在 ~/.cocoapods/repo 目录下添加了一个以你的私有 repo 为名的文件夹,但是并没有添加 spec 文件。

在终端执行命令:

pod repo add O2Specs https://github.com/marklin2012/O2Specs.git

这里用的是 https 地址,当然你也可以用 git 地址,不过这样有可能失败。如果失败,很大因素是你 githubssh 在本地没有配置好,配置方法可以看这里:Generating SSH keys,成功后可以看得到 .cocoapods 目录如下图所示:

p4

至此,我们已经在本地得到我们自己的私有仓库 O2Specs ,这是一个空的仓库。

2.添加私有的 Repo 安装到你的 CocoaPods

这个步骤需要我们事先完成 CocoaPods 依赖库的搭建,具体可以查看我们另外一篇教程:制作 CocoaPods 依赖库。如果这里你想先看看效果,也可以直接从 github 上 clone 示例工程继续下面的操作。

让我们进入到上面 clone 的示例工程目录中(或者你自己搭建的依赖库目录中):

p5

打开工程的 podspec 文件:

Pod::Spec.new do |s|
  s.name         = "O2View"             #名称
  s.version      = "0.0.1"              #版本号
  s.summary      = "Just testing"       #简短介绍
  s.description  = <<-DESC
                    私有Pods测试
                    * Markdown 格式
                   DESC

  s.homepage     = "http://aotu.io/"
  # s.screenshots  = "www.example.com/screenshots_1.gif"
  s.license      = "MIT"                #开源协议
  s.author             = { "linyi31" => "linyi@jd.com" }

  s.source       = { :git => "https://github.com/marklin2012/O2View.git" }
  ## 这里不支持ssh的地址,只支持HTTP和HTTPS,最好使用HTTPS
  ## 正常情况下我们会使用稳定的tag版本来访问,如果是在开发测试的时候,不需要发布release版本,直接指向git地址使用
  ## 待测试通过完成后我们再发布指定release版本,使用如下方式
  #s.source       = { :git => "http://EXAMPLE/O2View.git", :tag => s.version }
  
  s.platform     = :ios, "9.0"          #支持的平台及版本,这里我们呢用swift,直接上9.0
  s.requires_arc = true                 #是否使用ARC

  s.source_files  = "O2View/*.swift"    #OC可以使用类似这样"Classes/**/*.{h,m}"

  s.frameworks = 'UIKit', 'QuartzCore', 'Foundation'    #所需的framework,多个用逗号隔开
  s.module_name = 'O2View'              #模块名称

  # s.dependency "JSONKit", "~> 1.4"    #依赖关系,该项目所依赖的其他库,如果有多个可以写多个 s.dependency

end

这个文件本质上是一个 ruby 文件,这是我们事先已经实现好的依赖库的 podspec 文件,如果前面步骤都正常的话,也就是说我们认为这个 podspec 是合法的话,就可以直接将这些内容 push 到我们本地的 repo 中。为了避免错误,我们可以再验证一下,命令行输入:

pod lib lint

运行之后可能会得到下面的警告:

 -> O2View (0.0.1)
    - WARN  | source: Git sources should specify a tag.

[!] O2View did not pass validation, due to 1 warning (but you can use `--allow-warnings` to ignore it) and All results apply only to public specs, but you can use `--private` to ignore them if linting the specification for a private pod..
You can use the `--no-clean` option to inspect any issue.

由于我们的示例工程还没有生成正式的 release 版本, github 上并没有任何 tag,所以我们刚才填写 .podspec 文件填写 git 地址的时候没有填写指定 tag (上面文件的注释中有提到),解决方法我们可以先执行忽略警告的命令:

pod lib lint --allow-warnings

如果成功会出现如下输出:

 -> O2View (0.0.1)
    - WARN  | source: Git sources should specify a tag.

O2View passed validation.

到此,我们的 O2View.podspec 就符合规范了。

3.添加你的 Podspec 到你的 repo

在前面验证通过的基础上,我们接着执行命令:

pod repo push O2Specs O2View.podspec

执行完,如果失败会有相对应的警告和错误提示,只要按照警告和错误的详细信息进行修改和完善即可。成功的情况应该可以在终端看到类似的输出:

Validating spec
 -> O2View (0.0.1)
    - WARN  | source: Git sources should specify a tag.

Updating the `O2Specs' repo

Already up-to-date.

Adding the spec to the `O2Specs' repo

 - [Add] O2View (0.0.1)

Pushing the `O2Specs' repo

To https://github.com/marklin2012/O2Specs.git
   9f32092..8d0ced5  master -> master

再进入到 .cocoapods 的目录中,可以看到已经发生了变化:

p6

同时,我们还发现 O2Specsgithub 仓库也已经发生了变化:

p7

按照平时使用 CocoaPods 的习惯,我们添加依赖库之前会先搜索一下库,让我们执行一下命令:

pod search O2View

哈哈,可以看到已经建立成功了!

-> O2View (0.0.1)
   Just testing
   pod 'O2View', '~> 0.0.1'
   - Homepage: http://aotu.io/
   - Source:   https://github.com/marklin2012/O2View.git
   - Versions: 0.0.1 [O2Specs repo]

4.测试私有 pod

看到前面的搜索结果,小伙伴们是不是开始有点激动了?让我们建立一个普通的工程,命名为 TestPodDemo,然后在终端 cd 到其目录路径下,添加一个 Podfile 文件:

pod init

建立后修改 Podfile 文件内容如下:

use_frameworks!

target 'TestPodDemo' do

pod ‘O2View’

end

执行:

pod install

我们得到如下提示:

Updating local specs repositories
Analyzing dependencies
[!] Unable to find a specification for `O2View`

[!] Your Podfile has had smart quotes sanitised. To avoid issues in the future, you should not use TextEdit for editing it. If you are not using TextEdit, you should turn off smart quotes in your editor of choice.

找不到 O2View ? 额- -!。。。刚才 search 明明可以找到这个依赖库的,为什么现在找不到了呢?

别着急!其实原因是你在 Podfile 中没有指定路径,当你执行 pod install 的时候,CocoaPods 默认只会在 master 下搜索,而我们的 spec 是存在我们私有的 O2Specs 目录下的。所以解决方式很简单,就是引入搜索地址即可,在 Podfile 的顶部添加如下两行代码:

source 'https://github.com/CocoaPods/Specs.git'     #官方仓库地址
source ‘https://github.com/marklin2012/O2Specs.git’     #私有仓库地址

这里必须添加两个地址,默认情况下,你如果不添加 source ,系统会默认使用官方仓库地址,但是当你添加了 source 之后,系统就不会自动搜索官方地址,所以这两句都必须添加,否则其他基于官方的依赖库都不能使用了。

再次执行 pod install ,我们就可以看到很顺利的安装成功了:

Updating local specs repositories
Analyzing dependencies
Downloading dependencies
Using O2View (0.0.1)
Generating Pods project
Integrating client project
Sending stats
Pod installation complete! There is 1 dependency from the Podfile and 1 total pod installed.

恭喜!这样一来我们就可以使用这个私有库了!

发布稳定的依赖库版本

前面我们提到过,我们的这个实例依赖库 O2View 没有生成稳定的 release 版本。当我们调试完内容之后,一般都是要发布稳定版本的,更新之后再继续发布新版本。我们可以使用命令行或者在 github 页面手动生成,这里为了方便我们使用命令行,首先在终端中 cd 到之前的依赖库 O2View 的目录中,然后输入如下命令:

git tag '0.0.1'
git push --tags
git push origin master

这样我们就得到了一个稳定的 release 版本 0.0.1

p8

这里我用的版本号是 0.0.1 基于研发版本,关于版本号的一些规范可以参考:语义化版本 2.0.0

对于我们的 podspec 文件,我们也需要将 s.source 做一下小小的改动:

s.source       = { :git => "https://github.com/marklin2012/O2View.git", :tag => version }

这样我们使用这个依赖库的时候就能对应上版本号,并且知道在 github 中使用稳定的 release 版本代码。太棒了!

最后只需要再重复 push 一下我们的 Podfile 就可以!

接下来做什么?

好了,到这里我们已经完全掌握如何创建一个本地私有的 CocoaPods 了!我们完全可以把我们项目中得代码拆出来好好的封装一些 pods, 好好使用这个黑魔法!

祝大家玩得愉快!

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

推荐阅读更多精彩内容