Skip to content

CocoaPods私有库

ShenYj edited this page Dec 30, 2020 · 7 revisions

CocoaPods 模板类库开发 - 关于私有库

这篇笔记主要用来记录自己在实现开源库和私有库`CocoaPods`托管过程中

从产生疑问 -> 最终理解 这一个过程的总结

有关pod lib的基本使用, 参考 CocoaPods模板类库开发

疑问

  • 1. pod trunk pushpod repo push 本质区别是啥?
  • 2. pod repo push <私有索引库> <源码仓库地址>这一步骤可选, 这一步骤存在的意义是什么?
  • 3. 基于CocoaPods的组件化, pod repo push这一步到底需不需要
  • 4. 索引库是个啥?

分型 命令 作用
开源库 pod trunk push XXX.podspec podspec部署到Trunk并使其公开可用
私有库 pod repo push <私有索引库> XXX.podspec podspec部署到自己的私有spec库中

什么是索引库?

不论是Master还是CDN, 里面记录的都是托管类库各个版本的一个json文件, 里面记录了类库的各项信息

我们在GitHub上开源的仓库存仓的是源码, 也就是源码库, 在我们实际使用CocoaPods的过程中

  1. 我们通过Podfile配置依赖库
  2. 执行pod install来安装依赖库
  3. 在安装过程中会根据CocoaPods官方索引库找到我们的开源库, 并根据记录的类库信息找到我们的源码库地址

其实我们在完成开源库的开发后, 最后执行pod trunk push的目的也就是将这个库的索引信息提交到CocoaPods的官方索引库中去, 这样在其他环境下使用这个类库的时候就能够找到类库的各项信息, 在CocoaPods的官方描述中也有提到过Trunk will publish a canonical JSON representation of your Podspec
而且这个是CocoaPods为我们提供的, 开源的索引库

上面的内容理解了, pod repo push <私有索引库> XXX.podspec这一步的含义也就清晰了

既然不使用CocoaPods官方索引库, 那就在编写源码、提交源码库、编写podspec配置额外指定你自己的索引库, 并将索引提交到指定的索引库上去

至于大多数资料提到的私有库才会用到我觉得这都是次要的, 你的索引库是私有, 那就是私有源, 你的索引库是公开的, 就是开源索引库, 而我们在执行pod repo add <索引库>这一步骤的时候就是加了一个包管理器的源而已, 类似于用npmRubyGems这些包管理器换源一个道理, 大多数的包管理器是换源, 这个是添加一个源

所以 疑问1疑问2疑问4 也就解决了

  • 1. pod trunk pushpod repo push 本质区别是啥?
  • 2. pod repo push <私有索引库> <源码仓库地址>这一步骤可选, 这一步骤存在的意义是什么?
  • 4. 索引库是个啥?

在理解疑问3前, 先思考一下几个使用场景

  1. 通过pod lib开发类库时, 默认我们的Demo项目是直接通过:path => '../直接指向本地资源使用的

  2. 实现私有库前, 只创建一个仓库, 让索引库和源码库共用一个仓库

  3. 实现私有库, 创建两个仓库, 一个作为索引库, 另外一个作为源码库

首先, 基于场景1的实现, 也就是说我完全可以将自己的项目、分拆成lib的组件存在同一个仓库中来进行管理, 那这样会有什么问题?

使用pod lib模板, 项目结构是

workspace
    |
    ├── project (demo)
    |
    └── project (lib)

仿照这种结构, 完全可以通过多project依赖的方式来分开业务实现多个lib依赖, 但是版本控制可能是个问题, 虽然业务间进行了隔离提取, 但是可用性并不好, 脱离项目复用也是个问题

直接指定本地资源了, 只要配置好podspec, 代码都绑定项目和仓库了, 是否需要索引库也就不那么重要了

场景2场景3

我通过pod lib来完成每一个组件的开发, 并为其提供demo

  1. 每个源码库即索引库
  2. 每个源码库仅仅作为源码库, 额外新建一个私有库作为索引库

实现上, 感觉都没啥问题, 我觉得有必要单独一个索引库的好处就是在Podfile文件上的表现

比如我每个仓库既是源码库又是索引库

方式一: 指明仓库地址

pod 'SBLibrary', :git => 'https://github.com/ShenYj/SBLibrary.git'

方式二: 指明源

source 'https://github.com/ShenYj/SBLibrary.git'
...
pod 'SBLibrary'
...

而单独设置一个索引库的情况下(当然这些私有库都已经被索引源锁托管)

source 'https://github.com/ShenYj/PrivateRepo.git'

...
pod 'private1'
pod 'private2'
pod 'private2'

感觉这样结构上更加的清晰一些, 私有库多体现更明显, 还能保证源码库内只存在源代码和资源文件, 不用存放记录不同版本的podspec文件

其他差异

  • 比如没有将索引推送至索引库, 那么也就无法使用pod search

  • 索引库与源码库为相同的git仓库, 当添加到本地源后, 因为是相同仓库, 除了下载类库不同版本的podspec文件外, 还包含代码

    .
    ├── Componentization
    │   ├── Assets
    │   └── Classes
    │       ├── Core
    │       │   ├── xxx.swift
    │       │   └── xxx.swift
    │       ├── Course
    │       │   ├── xxx.swift
    │       │   └── xxx.swift
    │       ├── IAP
    │       │   ├── xxx.swift
    │       │   └── xxx.swift
    │       └── Record
    │           ├── xxx.swift
    │           └── xxx.swift
    ├── Componentization.podspec
    ├── Example
    │   ├── Componentization
    │   ├── Podfile
    │   ├── Podfile.lock
    │   ├── Pods
    │   │   ├── Alamofire
    │   │   │   ├── LICENSE
    │   │   │   ├── README.md
    │   │   │   └── Source
    │   │   ├── HandyJSON
    │   │   │   ├── LICENSE
    │   │   │   ├── README.md
    │   │   │   └── Source
    │   │   │       ├── ...
    │   │   ├── Local\ Podspecs
    │   │   │   └── Componentization.podspec.json
    │   │   ├── Manifest.lock
    │   │   ├── Moya
    │   │   │   ├── License.md
    │   │   │   ├── Readme.md
    │   │   │   └── Sources
    │   │   │       └── ...
    │   │   ├── Pods.xcodeproj
    │   │   │   └── project.pbxproj
    │   │   ├── RxSwift
    │   │   │   
    │   │   ├── SwifterSwift
    │   │   │   ├── LICENSE
    │   │   │   ├── README.md
    │   │   │   └── Sources
    │   │   │       └── ...
    │   │   ├── SwiftyJSON
    │   │   │   ├── LICENSE
    │   │   │   ├── README.md
    │   │   │   └── Source
    │   │   │       └── ...
    │   │   └── Target\ Support\ Files
    │   │       ├── Alamofire
    │   │       ├── Componentization
    │   │       ├── HandyJSON
    │   │       ├── Moya
    │   │       ├── Pods-Componentization_Example
    │   │       ├── Pods-Componentization_Tests
    │   │       ├── RxSwift
    │   │       ├── SwifterSwift
    │   │       └── SwiftyJSON
    │   └── Tests
    │       ├── Info.plist
    │       └── Tests.swift
    ├── LICENSE
    ├── README.md
    └── _Pods.xcodeproj -> Example/Pods/Pods.xcodeproj
  • 索引库与源码库为不同的git仓库, 那么本地索引库内不会包含源码, 更干净

    比如我自己的私有索引库, 执行pod add repo添加源后本地的索引库路径下/Users/shenyj/.cocoapods/repos/PrivateRepo

      .
      ├── Componentization
      │   └── 0.3.0
      │       └── Componentization.podspec
      └── README.md
    

    只有类库-> 版本 -> podspec文件

    另外将podspec提交到索引库, 也可以使用pod search

      -> Componentization (0.3.0)
      网络层基础封装.
      pod 'Componentization', '~> 0.3.0'
      - Homepage: https://github.com/ShenYj/Componentization
      - Source:   https://github.com/ShenYj/Componentization.git
      - Versions: 0.3.0 [PrivateRepo repo]
      - Subspecs:
          - Componentization/Core (0.3.0)
          - Componentization/Course (0.3.0)
          - Componentization/Record (0.3.0)
          - Componentization/IAP (0.3.0)
    
  • 3. 基于CocoaPods的组件化, pod repo push这一步到底需不需要

补充: 如果公司内部仓库为http, 最后push环节增加--allow-warnings即可

CocoaPods的使用理解还不够透彻, 如有错误还请及时指出

Getting Started

Social

Clone this wiki locally