pod私有库的创建和使用

注:因为最近公司需求,本文为参考他人网上资源后进行的尝试,可能与多个网上资源重复

cocoapods的原理

  1. Pods 项目最终会编译成一个名为 libPods.a 的文件,主项目只需要依赖这个 .a 文件即可。
  2. 对于资源文件,CocoaPods 提供了一个名为 Pods-resources.sh 的 bash 脚本,该脚本在每次项目编译的时候都会执行,将第三方库的各种资源文件复制到目标目录中。
  3. CocoaPods 通过一个名为 Pods.xcconfig 的文件来在编译时设置所有的依赖和参数。

工具依赖

➜  ~ nvm --version
0.31.3

➜  ~ ruby --version
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-darwin15]

➜  ~ pod --version
1.2.1

➜  ~ git --version
git version 2.11.0 (Apple Git-81)

tip:本文跳过cocoapods安装

查看本地pod 仓库

本地已经有一个master库(安装pod后自动就会存在,官方的目录)
OFToolSpec是后来创建的一个私有库

Type:版本管理工具类型及分枝名
URL:git仓库地址
Path:本地仓库地址(在根目录下.cocoapods下)

➜  ~ pod repo

master
- Type: git (master)
- URL:  https://github.com/CocoaPods/Specs.git
- Path: /Users/xiaodou_chenxiaoxiang/.cocoapods/repos/master

OFToolSpec
- Type: git (master)
- URL:  https://git.coding.net/one_fools/OFToolRepo.git
- Path: /Users/xiaodou_chenxiaoxiang/.cocoapods/repos/OFToolSpec

2 repos

创建pod lib

在桌面创建PodPrivate文件,然后在终端进入PodPrivate文件并运行命令 pod lib create OFPublicTool创建私有库模版

➜  ~ cd Desktop 
➜  Desktop mkdir PodPrivate
➜  Desktop cd PodPrivate 
➜  PodPrivate ls
➜  PodPrivate pod lib create OFPublicTool

以下是配置选择,可以使用默认选项(带有下划线的选项,并且除了Prefix前缀设置,其他的不区分大小写)

  1. 工程语言
  1. 是否需要Demo
  2. 测试框架
  3. 是否需要view测试
  4. 工程前缀
//设置使用的语言
What language do you want to use?? [ Swift / ObjC ]
 > ObjC
//是否为library创建一个demo工程
Would you like to include a demo application with your library? [ Yes / No ]
 > 
yes
//使用的单元测试框架(具体请参看下方`单元测试`链接)
Which testing frameworks will you use? [ Specta / Kiwi / None ]
 > None
//使用UITest
Would you like to do view based testing? [ Yes / No ]
 > no
//你的项目中类的前缀
What is your class prefix?
 > OF

单元测试
然后会在当前目录生成 OFPublicTool 文件夹,并且会在Xcode中自动打开这个项目
注意可能会有一个警告提示

A86EECEC-4BF2-4789-BC58-558ADD701F17.png

打开OFPublicTool/Example/OFPublicTool.xcworkspace 工程
删除此处的 ReplaceMe.m文件,在这里创建将要使用私有库管理的文件
C07AFF42-4781-4443-A45A-C4D1F016B948.png

如下:
F86C3A58-429A-4B39-9C7E-F05C8AAFB23B.png

然后修改此处的 OFPublicTool.podspec文件,下面标注必须修改的地方

05A1876C-4EE2-4B2B-B241-C39AD98AD3F4.png

创建git私有仓库(使用coding

申请账号后创建Git私有仓库项目


BACDCF36-B34C-4F97-B7F2-86DFFB1ED4F2.png

之后需要在页面上获取的信息有


9C15D4BB-9BE8-4204-B8F2-559A344ACEEE.png

创建pod私有库

把相关的信息修改到 OFPublicTool.podspec
以下是我的修改

s.summary          = 'My PublicTool.'
s.homepage         = 'https://coding.net/u/one_fools/p/OFPublicTool'
s.source           = { :git => 'https://git.coding.net/one_fools/OFPublicTool.git', :tag => s.version.to_s }

之后进入 Example目录使用 pod update命令

➜  Example git:(master) ✗ pod update

发现有报错信息 The validator for Swift projects uses Swift 3.0 by default...

35FAF51B-C569-43C4-A7A4-32D56D281351.png

不过上面有写到echo "2.3" > .swift-version
继续使用此命令,然后再来一次

➜  Example git:(master) ✗ echo "2.3" > .swift-version
➜  Example git:(master) ✗ pod update

安装成功后发现下面的警告并没有消失(暂时不管)
对项目进行 command + B构建一次应该会成功,然后在项目中 OFViewController.m 中引入

#import "OFPublicTool.h"

并对项目再次进行 command + B构建,若成功,说明 OFPublicTool.podspec 中的source_files路径是正确的

若是报错无法找到文件:

接下来用pod的命令检查一下此文件下的lib。
后退到podspec文件存在的目录下

➜  OFPublicTool git:(master) ✗ pod lib lint

 -> OFPublicTool (0.1.0)

OFPublicTool passed validation.

如果出现此处提示说明检查通过

pod spec lint命令检查一下远程的lib,现在没有提交到git私有仓库,一定会报错的

➜  OFPublicTool git:(master) ✗ pod spec lint

 -> OFPublicTool (0.1.0)
    - ERROR | [iOS] unknown: Encountered an unknown error ([!] /usr/bin/git clone https://git.coding.net/one_fools/OFPublicTool.git /var/folders/dr/688z508n1fb2m9bh9kqs5_ch0000gn/T/d20170520-7169-ee52z2 --template= --single-branch --depth 1 --branch 0.1.0

Cloning into '/var/folders/dr/688z508n1fb2m9bh9kqs5_ch0000gn/T/d20170520-7169-ee52z2'...
fatal: Remote branch 0.1.0 not found in upstream origin
) during validation.

Analyzed 1 podspec.

[!] The spec did not pass validation, due to 1 error.

发现报了一个错误,需要一个tag 0.1.0,下面将本地文件提交到git私有仓库并打一个0.1.0的tag

➜  OFPublicTool git:(master) ✗ git add .
➜  OFPublicTool git:(master) ✗ git commit -m"first commit"
➜  OFPublicTool git:(master) git remote add origin https://git.coding.net/one_fools/OFPublicTool.git
➜  OFPublicTool git:(master) git push origin master
➜  OFPublicTool git:(master) git tag -m"tag 0.1.0" 0.1.0
➜  OFPublicTool git:(master) git push --tags

git操作不再细述
上传成功之后再次用 pod spec lint命令检查一下远程的lib

➜  OFPublicTool git:(master) pod spec lint

 -> OFPublicTool (0.1.0)

Analyzed 1 podspec.

OFPublicTool.podspec passed validation.

➜  OFPublicTool git:(master) 

发现通过检查,这时候可以去私有仓库看一下会发现已经上传成功了

本地测试podspec文件

我们可以创建一个新的项目,在这个项目的Podfile文件中直接指定刚才创建编辑好的podspec文件,看是否可用。 在Podfile中我们可以这样编辑,有两种方式

platform :ios, '8.0'
 
target 'XDTestPod' do
  pod 'OFPublicTool', :path => '~/.cocoapods/repos/OFPublicToolSpec'      #指定路径
  pod 'OFPublicTool', :podspec => '~/.cocoapods/repos/OFPublicToolSpec/OFPublicTool.podspec'  #指定podspec文件
end

然后执行pod install命令安装依赖,打开项目工程,可以看到库文件都被加载到Pods子项目中了,不过它们并没有在Pods目录下,而是跟测试项目一样存在于Development Pods/PodTestLibrary中,这是因为我们是在本地测试,而没有把podspec文件添加到Spec Repo中的缘故。

向Spec Repo提交podspec

但是现在还没完,接下来我们把podspec文件上传的我们自己的spec仓库里,而不是cocoapods的仓库。
下面我们创建本地仓库并把这个podspec文件上传进去

➜  OFPublicTool git:(master) pod repo
➜  OFPublicTool git:(master) pod repo add OFPublicToolSpec https://git.coding.net/one_fools/OFPublicTool.git
➜  OFPublicTool git:(master) pod repo

master
- Type: git (master)
- URL:  https://github.com/CocoaPods/Specs.git
- Path: /Users/xiaodou_chenxiaoxiang/.cocoapods/repos/master

OFPublicToolSpec
- Type: git (tags/0.1.0^0)
- URL:  https://git.coding.net/one_fools/OFPublicTool.git
- Path: /Users/xiaodou_chenxiaoxiang/.cocoapods/repos/OFPublicToolSpec

OFToolSpec
- Type: git (master)
- URL:  https://git.coding.net/one_fools/OFToolRepo.git
- Path: /Users/xiaodou_chenxiaoxiang/.cocoapods/repos/OFToolSpec

3 repos

然后上传

➜  OFPublicTool git:(master) pod repo push OFPublicToolSpec OFPublicTool.podspec 

Validating spec
 -> OFPublicTool (0.1.0)

Updating the `OFPublicToolSpec' repo

Already up-to-date.

Adding the spec to the `OFPublicToolSpec' repo

 - [Update] OFPublicTool (0.1.0)

Pushing the `OFPublicToolSpec' repo

To https://git.coding.net/one_fools/OFPublicTool.git
   8632a92..98f3d44  master -> master

上传成功

最后检验

➜  OFPublicTool git:(master) pod search OFPublicTool
Creating search index for spec repo 'OFPublicToolSpec'.. Done!
[!] Unable to find a pod with name, author, summary, or description matching `OFPublicTool`

发现报错,这是因为search index中缓存没有清理,再次搜索会等待一段时间

➜  OFPublicTool git:(master) rm ~/Library/Caches/CocoaPods/search_index.json
➜  OFPublicTool git:(master) pod search OFPublicTool

添加到Cocoapods的官方库

添加到Cocoapods的官方库,可以使用trunk工具,具体可以查看官方文档

pod trunk register 631292061@qq.com 'Ec631292' ---verbose  #注册trunk,邮箱以及用户名请使用大家自己的。执行这个语句后,你的邮箱将会受到一封带有验证链接的邮件,如果没有请去垃圾箱找找,有可能被屏蔽了。点击邮件的链接就完成了trunk注册流程。
pod trunk me #如果终端显示了你的用户名和昵称,则说明注册成功。
pod trunk push OFPublicTool.podspec #通过trunk上传你的podspec文件,要cd到podspec文件所在目录执行

最后在一个新项目里引入使用,测试是否ok,只需要在项目的Podfile里增加以下一行代码即可

pod 'OFPublicTool', '~> 0.1.0'

注:每当你向Pod中添加了新的文件或者以后更新了podspec的版本都需要重新执行一遍pod update命令。

更新维护podspec

Pod::Spec.new do |s|
  s.name             = 'OFPublicTool'
  s.version          = '0.1.3'
  s.summary          = 'My PublicTool.'
  s.description      = <<-DESC
TODO: Add long description of the pod here.
                       DESC

  s.homepage         = 'https://coding.net/u/one_fools/p/OFPublicTool'
  # s.screenshots     = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
  s.license          = { :type => 'MIT', :file => 'LICENSE' }
  s.author           = { 'ECwlf' => '631292061@qq.com' }
  s.source           = { :git => 'https://git.coding.net/one_fools/OFPublicTool.git', :tag => s.version.to_s }
  # s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'

  s.ios.deployment_target = '8.0'

  s.subspec 'iCarousel' do |iCarousel|
    iCarousel.source_files = 'XDLibrary/Classes/iCarousel/**/*'
    iCarousel.public_header_files = 'XDLibrary/Classes/iCarousel/**/*.h'
  end

  s.subspec 'XDProgress' do |progress|
    progress.source_files = 'XDLibrary/Classes/XDProgress/**/*'
    progress.public_header_files = 'XDLibrary/Classes/XDProgress/**/*.h'
    progress.dependency 'MBProgressHUD', '~> 1.0.0'
  end

  # s.source_files = 'XDLibrary/Classes/**/*'
  
  # s.resource_bundles = {
  #   'XDLibrary' => ['XDLibrary/Assets/*.png']
  # }

  # s.public_header_files = 'Pod/Classes/**/*.h'
  # s.frameworks = 'UIKit', 'MapKit'
  # s.dependency 'AFNetworking', '~> 2.3'
end

因为我们创建了subspec所以项目整体的依赖dependency,源文件source_files,头文件public_header_files,资源文件resource等都移动到了各自的subspec中,每个subspec之间也可以有相互的依赖关系,比如XDProgress依赖于MBProgressHUD。不同的子模块之间还能互相依赖。

编辑完成之后,在测试项目里pod update一下,几个子项目都被加进项目工程了,写代码验证无误之后,就可以将这个工程push到远端仓库,并打上新的tag->1.0.0。
最后再次使用pod lib lint验证编辑好的podsepc文件,没有自身的WARNING或者ERROR之后,就可以再次提交到Spec Repo中了,命令跟之前是一样的

pod repo push OFPublicToolSpec OFPublicTool.podspec 

之后再次到~/.cocoapods/repos/OFPublicToolSpec目录下查看已经有两个版本了。

最后介绍一下如何删除一个私有Spec Repo,只需要执行一条命令即可

pod repo remove OFPublicToolSpec

这样这个Spec Repo就在本地删除了,我们还可以通过

 pod repo add OFPublicToolSpec https://git.coding.net/one_fools/OFPublicTool.git

再把它给加回来。
如果我们要删除私有Spec Repo下的某一个podspec怎么操作呢,此时无需借助Cocoapods,只需要cd到~/.cocoapods/repos/OFPublicToolSpec目录下,删掉库目录,然后在将Git的变动push到远端仓库即可.

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

推荐阅读更多精彩内容