美文网首页
Cocoapods,让iOS开发更简单(一):走近Cocoapo

Cocoapods,让iOS开发更简单(一):走近Cocoapo

作者: 清晨一杯豆浆 | 来源:发表于2020-10-27 10:17 被阅读0次

    前段时间结合自己平时的学习研究做了一个有关pods的内部分享,接下来会把相关资料以文字的形式分享出来,预估是一个pods系列,希望能较为全面的将其相关知识点与实践运用呈现出来,也希望和大家多多交流。话不多说,那我们就即刻出发吧!

    是什么

    • CocoaPods是OS和iOS平台上的一个第三方依赖库管理工具,通过它我们可以更加高效的依赖并管理被称为“Pods”的库。

    • 在iOS开发中,现在的Cocoapods已经是事实上的添加第三方库的标准方式了。

    • 它拥有超过49,000个第三方库,超过3,000,000个app都在使用CocoaPods做依赖管理,CocoaPods可以帮助你优雅的扩展你的项目。

    为什么使用它

    在iOS开发项目中,经常会使用第三方库,手动引入流程复杂,并且库之间存在依赖关系,手动管理较繁琐。但采用CocoaPods,安装和升级都只是一句命令的事情,让开发者可专注于业务本身。

    • 方便:方便查找、依赖、管理和更新第三方库,同时方便了工程调试和阶段性开发;

    • 规范:库的使用及创建都要符合标准;

    • 直观:对于库的创建和使用都清晰明了的按格式有标注;

    • 集中:库及项目中都有指定的文件进行相应的管理;

    • 自动化:在引入第三方库时可以做到自动为项目完成各种各样的配置,包括配置编译阶段、连接器选项、甚至是ARC环境下的-fno-objc-arc配置等;

    它是怎么起作用的

    CocoaPods是用 Ruby 写的,并由若干个 Ruby 包 (gems) 构成的。核心组件gems 分别是: CocoaPods/CocoaPods、CocoaPods/Core和 CocoaPods/Xcodeproj。

    • CocoaPods/CocoaPod
      这是一个面向用户的组件,每当执行一个 pod 命令时,这个组件都将被激活。该组件包括了所有使用 CocoaPods 涉及到的功能,并且还能通过调用所有其它的 gems 来执行任务。

    • CocoaPods/Core
      Core 组件提供支持与 CocoaPods 相关文件的处理,文件主要是 podfile 和 podspec。

    • CocoaPods/Xcodeproj
      这个 gem 组件负责所有工程文件的整合。它能够创建并修改 .xcodeproj 和 .xcworkspace 文件。

    基于以上核心组件,实现:

    • 自动化配置:通过一个名为 Pods.xcconfig 的文件来在编译时设置所有的依赖和参数。
    • 管理资源文件:CocoaPods 提供了一个名为 Pods-resources.sh 的 bash 脚本,该脚本在每次项目编译的时候都会执行,将第三方库的各种资源文件复制到目标目录中。
    • 依赖管理:CocoaPods将所有依赖的库都放在一个名为Pods的项目下,然后让主项目依赖Pods项目,Pods项目最终会编译为一个libPod-项目名.a静态库(Pods_xxx.framework),主项目依赖于该库。

    Spec Repo

    Spec Repo是所有的Pods的一个索引,可以理解为是一个容器。对于公有的Spec Repo,所有公开的Pods都通过这个库进行索引,其实际是GitHub上的一个Git仓库。当开发者使用了CocoaPods后会被clone到本地的~/.cocoapods/repos目录下,可以进入到这个目录看到master文件夹就是这个官方的Spec Repo,目录的结构为:

    ├── Specs
        └── [SPEC_NAME]
            └── [VERSION]
                └── [SPEC_NAME].podspec
    

    如何用

    安装Cocoapods环境

    CocaPods的安装在ruby环境上通过Gem 安装,具体安装步骤不赘述。

    //安装CocoaPods
    sudo gem install cocoapods
    #sudo gem install -n /usr/local/bin cocoapods
    
    pod setup
    

    podSpec文件

    podSpec文件可以理解为一个库的信息简介和说明书,支持列出源文件、framework、编译选项和某个库所需要的依赖等。
    podspec文件是一个Ruby的文件,示例:

    Pod::Spec.new do |s|
      s.name             = "PodTestLibrary"    #名称
      s.version          = "0.1.0"             #版本号
      s.summary          = "Just Testing."     #简短介绍,下面是详细介绍
      s.description      = <<-DESC
                           Testing Private Podspec.
                           DESC
      s.homepage         = "https://github.com/hello/PodTestLibrary"         
      #主页,这里要填写可以访问到的地址,不然验证不通过
      s.license          = 'MIT'              #开源协议
      s.author           = { "hello" => "hello@good.com" }            #作者信息
      s.source           = { :git => "https://github.com/hello/PodTestLibrary.git", :tag => "0.0.1" }      
      #项目地址,支持HTTP和HTTPS,最好使用HTTPS
    
      s.platform     = :ios, '7.0'            #支持的平台及最低版本
    
      s.source_files = 'Pod/Classes/**/*'     
      #代码源文件地址,如果有多个目录下则用逗号分开,目录指定了pod install下载的内容
      s.resource_bundles = {
        'PodTestLibrary' => ['Pod/Assets/*.png']
      }                                       #资源文件地址
    
      s.public_header_files = 'Pod/Classes/**/*.h'   #公开头文件地址
      s.frameworks = 'UIKit'                  #所需的framework,多个用逗号隔开
      s.dependency 'AFNetworking', '~> 2.3'   
      #依赖关系,该项目所依赖的其他库,如果有多个需要填写多个s.dependency
    end
    

    subspec

    subspec模板:

    s.subspec '子模块名称' do |别名,不能和子模块名称相同,比如ss|
    
    ss.source_files = ''
    
    end
    

    subspec示例:

    Pod::Spec.new do |s|
      s.name             = "PodTestLibrary"
      s.version          = "1.0.0"
      s.summary          = "Just Testing."
      s.description      = <<-DESC
                           Testing Private Podspec.
                           * Markdown format.
                           DESC
      s.homepage         = "https://github.com/hello/PodTestLibrary"
      s.license          = 'MIT'
      s.author           = { "hello" => "hello@good.com" }
      s.source           = { :git => "https://github.com/hello/PodTestLibrary.git", :tag => "1.0.0" }
    
      s.platform     = :ios, '7.0'
    
      #s.source_files = 'Pod/Classes/**/*'
      #s.resource_bundles = {
      #  'PodTestLibrary' => ['Pod/Assets/*.png']
      #}
      #s.public_header_files = 'Pod/Classes/**/*.h'
    
      s.subspec 'NetWorkEngine' do |networkEngine|
          networkEngine.source_files = 'Pod/Classes/NetworkEngine/**/*'
          networkEngine.public_header_files = 'Pod/Classes/NetworkEngine/**/*.h'
          networkEngine.dependency 'AFNetworking', '~> 2.3'
      end
    
      s.subspec 'CommonTools' do |commonTools|
          commonTools.source_files = 'Pod/Classes/CommonTools/**/*'
          commonTools.public_header_files = 'Pod/Classes/CommonTools/**/*.h'
          commonTools.dependency 'OpenUDID', '~> 1.0.0'
          commonTools.dependency 'NetWorkEngine'
      end
    
      s.frameworks = 'UIKit'
    end
    

    原项目整体的依赖dependency、源文件source_files、头文件public_header_files和资源文件resource等都移动到了各自的subspec中,每个subspec之间也可以有相互的依赖关系,比如CommonTools就依赖于NetWorkEngine。

    在podSpec中建立subspec,有以下作用:

    • pod依赖文件划分在不同的目录结构下;
    • 实现按需依赖;

    Podfile文件

    Podfile 文件用于定义项目所需要使用的第三方库以及项目的基本配置。举例如下:

    source 'https://github.com/CocoaPods/Specs.git'  # 官方库源
    source 'https://gitlab.corp.cootek.com:hello/PodTestSpec.git'   # 私有库源
    
    
    platform :ios, '7.0'
    
    pod 'PodTestLibrary/NetWorkEngine', '1.0.0'  #依赖某一个部分
    
    pod 'PodTestLibrary', '1.0.0'   #使用整个库
    

    管理依赖库版本号

    • 不指定任何版本号,举例为:
    pod 'AFNetworking'
    
    • 指定固定的版本号,举例:
    pod 'AFNetworking', '1.0' // 版本号指定为1.0
    

    还有一些灵活的依赖用法,会在同系列后续文章专门板块中介绍,敬请关注。

    Podfile.lock文件

    最后一次更新pods时,保存所有第三方库的版本号。


    podLock文件.png

    Pods目录

    保存通过pod install 或 pod update下载下来的第三方库的代码。

    xxx.xcworkspace文件

    接入CocoaPods后重新生成的一个工作空间,打开该文件进行开发。

    常用命令

    常用命令有:

    pod --help:可以查看pod可以使用的命令;
    pod repo list: 查看本地spec仓库列表;
    pod init:项目pod初始化,创建默认的Podfile文件;
    pod install:安装pods库;
    pod install --no-repo-update:安装框架,不更新本地索引,不会升级本地代码库;
    pod update:升级、添加、删除框架;
    pod update --no-repo-update:更新框架,不更新本地索引,可安装框架或删除不用的框架,但不会升级安装已安装的框架;
    pod list:列出项目中所有依赖的库;
    pod repo update:从远程仓库更新本地spec repo仓库;
    

    哪些地方可以用

    依赖公共库

    pod 'AFNetworking', '~> 0.1.5'
    

    依赖私有库

    pod 'PodTestLibrary', '~> 0.1.0'
    

    如果我们同时使用了公有库和私有库,我们只需要在Podfile的头部同时把公有库和私有库的source加上即可。

    创建私有库

    下面会在本系列中专门出一个创建私有库的文章,大家敬请期待吧。

    创建公有库

    如果要添加到Cocoapods的官方库了,可以使用trunk工具,具体可以查看官方文档
    在 guides.cocoapods里面有一个 Getting setup with Trunk,注册 trunk,它的作用是能够让我们把本地的 spec 文件上传到 gitHub的远程索引库,发布自己的代码到Cocoapods供广大开发者使用。

    相关文章

      网友评论

          本文标题:Cocoapods,让iOS开发更简单(一):走近Cocoapo

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