CocoaPods,创建远程私有库

关于组件库文件夹分层可以参考
组件库(私有库)维护---文件分层和文件夹一起有层次上传
使用Cocoapods创建/管理私有库(高级用法)

在上一篇文章CocoaPods,创建属于自己的公开库 中我们讲了如何将自己的框架发布到CocoaPods中供别人来使用。在这一篇文章我将来介绍下如何利用CocoaPods来打造属于自己的远程私有库。

背景

随着公司业务的发展以及产品线的增加,我们需要将APP拆分为若干个基础组件、功能组件和业务组件,以便跨APP使用,并且为了方便管理和维护,对于这些组件我们也想利用CocoaPods来统一管理,但是呢又不想开源让别人使用,只是想让自己内部的团队去使用,这种情况该如何操作呢?下面我们就一步步的带领大家去创建一个属于自己的远程私有仓库。

一在代码托管平台创建私有库

在代码托管平台创建私有仓库,因为GitHub上私有仓库需要收费,这里以Coding.net为例,如下图:

二 创建PodSpec文件

据我所知创建PodSpec文件可以通过两种方式,第一种通过 pod spec create xxx命令来创建,第二种就是通过 pod lib create xxx命令来创建,相比较之下我更喜欢第二种方式。因为通过第二种方案我们可以选择生成Example工程和测试框架,方便调试以及帮助他人学习使用,更加的方便。
在终端中 cd 到一个空的目录下,运行如下命令:

pod lib create privateLib

CocoaPods会让我们回答几个问题,如下图所示:

把组件相关的类放到 privateLib/Classes 目录中,这是因为 Example 工程生成的 Podfile 文件中指定了这个目录是源文件地址,我们将一个UIView的分类放到该目录下,如下:


12.png

然后在终端中 cd 到 Example 目录下并运行 pod install命令,将我们的宿主工程也就是Example与我们拖入的组件建立依赖关系,这样我们就可以正常的使用我们的Example工程了。

三 发布组件到代码托管平台

在代码托管平台上建立一个私有的仓库

git add .
git commit -m "项目初始化"
git remote add origin https://git.coding.net/Guanzp/privateLib.git

紧接着给我们的组件打上标签,其实也就是版本

git tag -a "0.1.0" -m "Version 0.1.0"
git push --tags

注:

// 删除本地tag
git tag -d <tagname>

// 删除远程tag
git push origin --delete <tagname>

四 编辑 podspec 文件

接下来我们要编辑 podspec 文件,因为在上一篇文章中我们已经详细的介绍过该文件这里就不在赘述。然后通过 pod lib lint测试 podspec 文件是否可用

五 创建私有Spec库

在 代码托管平台上另外建一个名字为 spec 的仓库,作为我们私有的 podspec 专用仓库,用于存储spec文件, 而不是我们的项目, 然后在本地添加一个新的源

 pod repo add privateSpec https://git.coding.net/Guanzp/privateSpec.git

然后我们就会发现在本地多了一个名称为privateSpec的索引库

22.png

紧接着将刚才我们编辑好的podspec文件push到本地spec索引库中,同时同步到远程spec库中。

pod repo push privateSpec privateLib.podspec

这样远程仓库和本地索引库中就都有了

本地索引库
远程索引库

五 使用远程私有库

使用方式和其他的开源库一样,但不同的是,需要在头部增加

source 'https://github.com/CocoaPods/Specs.git'#github 官方仓库地址
source 'https://git.coding.net/xxx/privateSpec.git'#自己的远程私有库地址

use_frameworks!

target 'privateLibTest' do
    
  pod 'privateLib'
  
end

遇到的问题

  1. pod lib lint验证成功了,但是在接下来的pod repo push报错而且报的是就是podspec无法通过验证,解决方法,重新提交一个tag并push。在执行pod repo push,验证通过。

后记

  1. 组件依赖。有时候我们开发的组件有可能会依赖其它三方的组件,比如我们的组件对AFNetWorkingSDWebImage有依赖:这个时候我们只需要在podspec文件中添加下面两个依赖即可。
 s.dependency 'AFNetworking'
  s.dependency 'SDWebImage'
  1. 资源加载问题。当组件中使用到图片等资源文件的时候,可以将图片放到Assets文件夹中,如下图:
    [图片上传失败...(image-74892f-1516092123165)]
    同时,我们需要对podspec文件进行修改,指定Bundle资源文件路径:
  s.source_files = 'XMGFMMain/Classes/**/*'
  
  s.resource_bundles = {
     'XMGFMMain' => ['XMGFMMain/Assets/*']
   }

因为图片是存放在组件中,所以需要在当前类所在的Bundle中去查找图片资源,而不是在MainBundle中。比如下图:
[图片上传失败...(image-38f09f-1516092123165)]

NSBundle *currentBundle = [NSBundle bundleForClass:[self class]];

NSString *imagePath = [currentBundle pathForResource:@"tabbar_bg@2x.png" ofType:nil inDirectory:@"XMGFMMain.bundle"];
UIImage *image = [UIImage imageWithContentsOfFile:imagePath];
    self.backgroundImage = image;

同理,在组件中加载xib文件

NSBundle *currenBundle = [NSBundle bundleForClass:self];

XMGMiddleView *middleView = [[currenBundle loadNibNamed:@"XMGMiddleView" owner:nil options:nil] firstObject];
  1. 统一披露API。组件内部提供的服务很多, 如果他人使用, 无法确定有哪些API,如何解决?可以通过统一披露API来解决这个问题。在API中我们需要考虑:需要提供哪些服务给外界;外界需要给你提供哪些服务等;
  2. 当大家在进行 pod search AFNetWorking时候,我们会发现它下面有很多Subspaces,其实很容易理解,有时候我们只想用AFNetWorking中的Reachability,而又不想将AFNetWorking整个框架都导入进来。那么我们可不可以模仿它这么做呢?
-> AFNetworking (3.1.0)
   A delightful iOS and OS X networking framework.
   pod 'AFNetworking', '~> 3.1.0'
   - Homepage: https://github.com/AFNetworking/AFNetworking
   - Source:   https://github.com/AFNetworking/AFNetworking.git
   - Versions: 3.1.0, 3.0.4, 3.0.3, 3.0.2, 3.0.1, 3.0.0, 3.0.0-beta.3,
   3.0.0-beta.2, 3.0.0-beta.1, 2.6.3, 2.6.2, 2.6.1, 2.6.0, 2.5.4, 2.5.3, 2.5.2,
   2.5.1, 2.5.0, 2.4.1, 2.4.0, 2.3.1, 2.3.0, 2.2.4, 2.2.3, 2.2.2, 2.2.1, 2.2.0,
   2.1.0, 2.0.3, 2.0.2, 2.0.1, 2.0.0, 2.0.0-RC3, 2.0.0-RC2, 2.0.0-RC1, 1.3.4,
   1.3.3, 1.3.2, 1.3.1, 1.3.0, 1.2.1, 1.2.0, 1.1.0, 1.0.1, 1.0, 1.0RC3, 1.0RC2,
   1.0RC1, 0.10.1, 0.10.0, 0.9.2, 0.9.1, 0.9.0, 0.7.0, 0.5.1 [master repo]
   - Subspecs:
     - AFNetworking/Serialization (3.1.0)
     - AFNetworking/Security (3.1.0)
     - AFNetworking/Reachability (3.1.0)
     - AFNetworking/NSURLSession (3.1.0)
     - AFNetworking/UIKit (3.1.0)

其实很简单,我们只需要在podspec文件中添加subspec即可,比如

Pod::Spec.new do |s|
  s.name             = 'BaseClass'
  s.version          = '1.1.0'
  s.summary          = 'BaseClass.这里是一些公共类'

s.subspec 'Base' do |sb|
sb.source_files = 'BaseClass/Classes/Base/**/*'
end

s.subspec 'Category' do |sb|
sb.source_files = 'BaseClass/Classes/Category/**/*'
end

s.subspec 'Network' do |sb|
sb.source_files = 'BaseClass/Classes/Network/**/*'
#因为Network这个类库对AFNetworking、SDWebImage和Category有依赖
sb.dependency 'AFNetworking'
sb.dependency 'SDWebImage'
sb.dependency 'BaseClass/Category'
end

s.subspec 'Tool' do |sb|
sb.source_files = 'BaseClass/Classes/Tool/**/*'
end

当我们打上标签并且执行pod repo push privateSpec privateLib.podspec之后在终端中执行pod search BaseClass

-> BaseClass (1.1.0)
   BaseClass.这里是一些公共类
   pod 'XMGFMBase', '~> 1.1.0'
   - Homepage: https://coding.net/u/Guanzp/p/BaseClass
   - Source:   https://git.coding.net/Guanzp/BaseClass.git
   - Versions: 1.1.0, 1.0.0, 0.1.0 [privateSpec repo]
   - Subspecs:
     - BaseClass/Base (1.1.0)
     - BaseClass/Category (1.1.0)
     - BaseClass/Network (1.1.0)
     - BaseClass/Tool (1.1.0)

是不是很神奇?哈哈,假如以后我们只想用BaseClass中的某一个组件而又不想导入整个BaseClass,那么我们只需要在podfile文件中导入该子 组件 即可。

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

推荐阅读更多精彩内容