美文网首页
使用Cocoapod建立自己公司的私有库

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

作者: Hanten | 来源:发表于2018-04-12 15:29 被阅读33次

    背景说明

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

    相关文章

      网友评论

          本文标题:使用Cocoapod建立自己公司的私有库

          本文链接:https://www.haomeiwen.com/subject/iizxkftx.html