使用Cocoapod建立自己公司的私有库

背景说明

之前一段时间因为公司需要帮客户定制自己的App,但是基本逻辑都是跟我们现有App差不多,如果直接copy一份项目出来改名,无疑会为将来的维护成本添加难度,倒不是说解决困难,而是需要copy重复的代码,项目少的时候还好说,一旦多起来......

因此,将公共部分的代码抽离出来变得很有必要,抽取出来的这部分公共代码使用Cocoapod进行管理无疑是当下最好的选择,下面分享在使用Cocoapod创建私有库的一些经验,希望能够帮到你。

利用Cocoapod创建私有库

一、创建podspec文件

在终端上cd到需要创建的目录文件夹下,然后执行命令pod spec create xxx,其中xxx就是对应的podspec文件名,应保持与当前统计文件夹名字一致,例如:

pod spec create Tool    // 此时生成的podspec文件就是 Tool.podspec

二、配置podspec文件

基本用法

下面是基本的一些配置,想要使用可以直接copy然后替换其中的内容为自己的即可。具体意义是什么我就不解释了,看字面就可以看得出来,在生成的podspec文件里面也有对应的注释,想了解的话可以看注释。

Pod::Spec.new do |s|
    s.name         = "Tool"
    s.version      = "0.0.1"
    s.summary      = "A short description of Tool."
    s.description  = "我的一些工具类组件"
    s.homepage     = "https://gitee.com/hanten"
    s.license      = "MIT"
    s.author       = { "Hanten" => "zhiqiangit@126.com" }
    s.platform     = :ios
    s.ios.deployment_target = '8.0'
    s.source       = { :git => "https://gitee.com/hanten/swift_pod.git", :tag => "#{s.version}" }
    s.source_files = "Tool/**/*.{h,m}}"  # 如果是swift就将.{h,m}换为.swift
end

高级用法

1、依赖

// 依赖第三方框架
s.dependency 'AFNetworking'
// 依赖第三方存放本地的.framework,Resource是与Tool同级的文件夹,我用来放资源的地方,路径可以根据自己具体配置
s.ios.vendored_frameworks 'Resource/*.framework'
// 依赖第三方存放本地的.a
s.ios.vendored_libraries = "Resource/*.a"
// 依赖系统.framework
s.frameworks = 'SystemConfiguration','CoreGraphics','CoreTelephony'
// 依赖系统.a
s.libraries  = 'iconv','sqlite3','stdc++'

2、资源文件(包括图片、plist文件、xib文件)

一般情况下私有库图片等资源文件是放在bundle下的,在使用的时候需要从bundle中拿取出来,比如:

// 我新建了一个叫myShare.bundle文件夹,里面存放图片,然后我需要引用它,在podspec文件中
s.resource = "Resource/myShare.bundle"

// 在OC代码中,在使用的时候,如果不指定bundle的话会找不到该图片资源
NSURL *bundleURL = [[NSBundle mainBundle] URLForResource:@"myShare" withExtension:@"bundle"];
NSBundle *bundle = [NSBundle bundleWithURL:bundleURL];
UIImage *image = [UIImage imageNamed:@"my_share_session" inBundle:bundle compatibleWithTraitCollection:nil];


// 需要注意的是xib文件的引用,在podspec中配置,就会在pod install后自动生成ShareXibBundle,或者你把xib放在自己建的bundle下,在引用的时候也需要指定该bundle
s.resource_bundles = {
 'ShareXibBundle' => ['Tool/Share/**/*.xib']
}

// 在OC中引用,比如注册cell,这样才能正确引用到xib文件
NSString *path = [[NSBundle mainBundle] pathForResource:@"ShareXibBundle" ofType:@"bundle"];
NSBundle *bundle = [NSBundle bundleWithPath:path];
[_tableView registerNib:[UINib nibWithNibName:@"ShareCell" bundle:bundle] forCellReuseIdentifier:@"Cell"];

3、使用subspec分模块引入

有的时候我们并不希望将所有的模块都一起被引入到项目中,因为某些模块我们压根就用不到,但是却因为其他需要的模块被一起引入进来了,这个就很烦了。

这时候我们就需要分模块引入了,分模块引入我知道的两种方式:
1、建立多个podspec,每一个模块对应一个podspec文件,这样的话就会新建很多个podspec去对应,麻烦且看起来不优雅,不建议使用;
2、使用subspec,只需要添加一个主的podspec即可,这是目前我在使用的,下面是我的配置:

Pod::Spec.new do |s|
    s.name         = "Tool"
    s.version      = "0.0.1"
    s.summary      = "A short description of Tool."
    s.description  = "我的一些工具类组件"
    s.homepage     = "https://gitee.com/hanten"
    s.license      = "MIT"
    s.author       = { "Hanten" => "zhiqiangit@126.com" }
    s.platform     = :ios
    s.ios.deployment_target = '8.0'
    s.source       = { :git => "https://gitee.com/hanten/swift_pod.git", :tag => "#{s.version}" }
    # s.source_files = "Tool/**/*.{h,m}}"  # 如果是swift就将.{h,m}换为.swift
    
    # 基础依赖
    s.subspec "Base" do |ss|
        ss.source_files     = "Tool/Base/**/*.{h,m}}"
    end

    # 日期控件
    s.subspec "Date" do |ss|
        ss.source_files         = "Tool/Date/**/*.{h,m}"
    end
    
    # 分享组件
    s.subspec "Share" do |ss|
        ss.source_files         = "Tool/Share/**/*.{h,m}"
        ss.dependency 'Tool/Base'
    end
end

只需要简单的配置就可以分模块引入了,相关的依赖在subspec上写就可以了。
需要注意的是父spec需要把source_files给去掉,因为我们使用了subspec来引用

三、项目引用

正常引用

如果没有使用分模块引用,那么在Podfile中应该这样引用:

pod 'Tool', :path => '../swift_pod'

分模块引用

使用了分模块引用,在Podfile中如下引用:

pod 'Tool', :path => '../swift_pod', :subspecs => [
    'Date', # 日期控件
    'Share' # 分享组件
]

后记

最近有时间会把之前的一些项目经验分享出来,有什么写得不对的欢迎大家指正,共同进步!点击跳转Cocoapod官方链接

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

推荐阅读更多精彩内容