美文网首页
cocoaPods:公有库私有库

cocoaPods:公有库私有库

作者: 康小曹 | 来源:发表于2019-06-04 22:15 被阅读0次

    一、建立依赖库

    依赖库说白了就是存放第三方代码的库,而 cocoapods 本质就是第三方库维护和导入的便利性工具。依赖库也叫 pod 库,一般都是发布在公共的代码存放网站上供别人下载和使用,比如 github 上的 AF、MJRefesh等。

    而公司中很多时候并不像泄露代码,但是又需要使用组件化的框架,这个时候就会把自己的代码发布到私有仓库上,这种 pod 库一般称为私有库。其本质和 AF、MJRefesh 等没有任何区别,唯一的区别就是一个公开,一个不公开。

    1.在git上创建工程

    一般而言,依赖库的建立可以直接使用公开类服务器如github中的仓库,也可以是私有服务器,比如 gitlab。这里使用 gitlab 作为演示


    创建依赖库

    2.使用git管理工程

    直接使用sourceTree新增一个仓库即可:


    使用sourceTree拉去依赖库

    3.将代码上传到依赖库中

    如果初始化中勾选使用readMe初始化,那么工程中就有一个README.md文件;
    这一步只需要将代码赋值到改工程中提交即可,这里以修改README.md文件做演示:


    update

    二、创建spec仓库

    spec 仓库的概念相当于一个映射,可以理解成商品的清单。因为 pod 库会有很多,每个 pod 库都会有一个自己的代码存放地址,如果想要导入很多 pod 库,挨个在 podfile 上添加地址,这是不现实的,也很不方便。

    spec 仓库就是存放了所有的 pod 库的代码地址和信息,在使用特定的 pod 库时,直接在这个仓库中查找到其对应的代码下载地址进行下载,并根据 pod 库的一些配置信息进行相对应的配置,这些过程全都是自动化脚本实现的,关键文件有:podfile、spec文件、spec仓库。

    我们使用 cocoapods 时,第一次pod update时都会下载 spec 仓库,仓库很大,所以第一次会很慢。本质就是下载 https://github.com/CocoaPods/Specs
    中的内容到本地,而且在我们电脑中可以直接找到这个 spec 库的内容,具体地址就不贴出来了,很方便就能找到。

    1.在git上创建spec仓库

    这一步和上一步中创建依赖库是同一个操作,只是 spec 库的唯一作用就是用来存储私有库对应的spec。在pod时,source 需要设置spec对应的地址,也就是现在要创建的这个仓库的地址。和共有库(比如AF、SDWebimage等)的唯一区别就是共有库的spec文件是存储在cocoapod的master分支中的,私有库的spec文件存储在私有仓库中;


    specRepo

    2.使用git管理spec仓库

    同理,使用sourceTree直接拉取,略。

    三、依赖库和spec库的整合链接

    1.依赖库生成spec文件

    初始化spec的命令:

    pod spec create specName
    
    create spec

    2.spec文件的配置

    基础格式:

    Pod::Spec.new do |s|
    ...
    end
    

    解释:
    将spec略缩成s来表达
    步骤:
    1.填写基本信息(Spec Metadata)

      s.name         = "XKQuote"
      s.version      = "0.0.1"
      s.summary      = "the summary of Spec."
      s.description  = "description of the Spec."
      s.homepage     = "http://EXAMPLE/XKQuote"
    

    2.Author Metadata

      s.author             = { "caoxk" => "289722789@qq.com" }
    

    备注:这里的作者和邮箱(联系方式)必须和下面的License保持一致
    3.Spec License
    格式:

      s.license      = { :type => "MIT", :file => "LICENSE" }
    

    一般使用MIT License:


    create License(1)
    create License(2)

    创建完成后的样式:


    MIT License

    备注:license可以理解成一种版权信息,甚至可以理解成就是一串单纯的字符串,创建方法可以直接创建空文件然后复制字符串,也可以再gitlab上创建
    4.Platform Specifics(平台信息)

    s.platform     = :ios, "8.0"
    
      #  When using multiple platforms
      # s.ios.deployment_target = "5.0"
      # s.osx.deployment_target = "10.7"
      # s.watchos.deployment_target = "2.0"
      # s.tvos.deployment_target = "9.0"
    

    5.Source Location(源地址)

      s.source       = { :git => "http://EXAMPLE/XKQuote.git", :tag => "#{s.version}" }
    

    所支持的key:
    :git => :tag, :branch, :commit, :submodules
    :svn => :folder, :tag, :revision
    :hg => :revision
    :http => :flatten, :type, :sha256, :sha1
    其中,git、svn、hg、http是来源渠道。另外,"url地址",这个相当于是默认的key。
    我们例子中gitlab中依赖库的地址即可填写:

      s.source       = { :git => "https://gitlab.com/caoxk289722789/xkquote", :tag => "#{s.version}" }
    

    备注:

    • source和homePage没有关系。homePage只是作者告诉读者的一个非必要性信息(其实Metadata中最重要的几个就是name、version、author)
    • s.version == s.version.to_s ???
      6.Source Code(很重要)
      源文件选项,也就是告诉cocoapods你需要复制到项目中的文件有哪些
      语法:
      // 源文件(要拷贝的文件)
      s.source_files  = "Classes", "Classes/**/*.{h,m}"
      // 排除在外的文件
      s.exclude_files = "Classes/Exclude"
      // 头文件(如果没有则会暴露所有的头文件,具体怎么用还要再试试)
      s.public_header_files = "Classes/**/*.h"
    

    例子:
    文件的结构:


    source file

    写法:

      s.source_files  = "QLCrashGuardDemo/QLCrashGuardSupportFiles/**/*.{h,m}"
    

    本例子中直接使用README来做演示:


    image.png

    写法:

      s.source_files  = "SourceFiles/*.{h,m}"
    #s.exclude_files = "Classes/Exclude"
    #s.public_header_files = "Classes/**/*.h"
    

    备注:
    *:表示所有格式的文件
    7.Resources
    主要是添加资源文件,比如图片等
    8.Project Linking
    主要是添加framework
    9.Project Settings(重点)
    主要是添加依赖

    3.验证spec文件

    命令:

    pod spec lint(需要在对应的路径下运行)
    

    如图:


    image.png

    验证后的警告可以不修改,报错是必须修改的,按照提示修改报错知道验证通过即可;
    通过后的样式:


    image.png

    备注
    1.添加tag时,要推送到远端,不然仍然找不到和version对应的tag
    2.及时推送了tag,有时候可能是缓存的原因让然会导致更新不及时,此时新增一个全新的tag再验证即可

    按照模板填写即可
    官方文档:https://guides.cocoapods.org/syntax/podspec.html#social_media_url
    几个重点地方:

    4.添加spec仓库到本地

    这一步就是下载spec仓库到本地,相当于第一次 pod update时,cocoapods会自动下载https://github.com/CocoaPods/Specs
    的内容到本地,这一次是我们自己手动下载我们自己的 spec 索引到本地。

    命令:

    pod repo add specFileName(给spec仓库在本地的命名) spec(仓库的地址)
    

    运行命令:

    pod repo add XKQuote https://gitlab.com/caoxk289722789/xkquotespec
    Cloning spec repo `XKQuote` from `https://gitlab.com/caoxk289722789/xkquotespec`
    

    拉取完成后的目录是这样的:


    拉取仓库到本地

    注:specFileName 相当于一个文件夹名称,怎么命名其实无所谓。cocoapods 的仓库命名为 master。spec 仓库的地址就是上一步中新建存放 spec 文件的仓库地址。

    5.将依赖库的spec文件push到spec仓库

    本地有了 spec 索引,但是其实这个 spec 索引中还没有我们即将使用到的私有库的信息,也就是没有源代码的下载地址,这个时候需要把我们私有库的 podspec 文件 push 到 spec 库中,从而建立索引,这样我们 pod 的时候就可以先去 spec 库中找到这个私有库,然后提取里面存储的私有库的 podspec 文件,利用文件中的 source 地址下载源码,并且根据 podspec 文件中的配置命令对源码和工程进行相应的配置,这样就大功告成,可以使用我们自己的私有库了。

    命令如下:

    pod repo push XKQuote(spec repo的名称) XKQuote.podspec(spec文件名)
    

    添加并push之后会见到如下效果:


    image.png

    这里说一下,如果是直接 push 到公有库,也就是 github 上的 cocopods 的spec 仓库,直接使用 trunk 命令即可,如下:

    pod trunk push XXX.podspec
    

    四、在项目中导入依赖库

    pod

    备注:
    1.需要添加对应spec repo的地址,不然会找不到对应的依赖库
    2.pod update之前要确保已经add了spec repo

    pod成功的结果:


    image.png

    五、pod中使用本地路径:

    比如:

        pod 'BaseBusiness', :path => '../../BaseBusiness'
    

    几个特性:
    1.本地没有spec repo都没问题,依据的是本地path中对应的spec
    2.spec不用每次都push,修改后立马生效
    3.直接使用本地的source_files中设置的文件,不拷贝,会建立索引,所以在工程中修改后会影响到源文件,如果有git,也会有git关联,所以很适合开发阶段来使用。

    总结:
    cocoapod的本质是分为两个仓库,确切的说分为量种仓库。可以形象的理解成海港中有很多仓库,一种是存储货物的仓库,而在一个办公室里面,有一个关于这些货物信息的清单。依赖库相当于货物仓库,spec repo相当于清单仓库。每次pod update,先根据source下载货物清单,再根据pod xxx中具体需要哪种货物去清单找寻找对应的spec,了解这个货物的信息和配置后再进行pod,其实pod的做了什么操作,具体见下一章节
    ios中的project、workspace、libary、framwork

    相关文章

      网友评论

          本文标题:cocoaPods:公有库私有库

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