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

2018-04-12  本文已影响33人  Hanten

背景说明

之前一段时间因为公司需要帮客户定制自己的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官方链接

上一篇下一篇

猜你喜欢

热点阅读