CocoaPods 私有库

优质
小牛编辑
126浏览
2023-12-01

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 也就解决了

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

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

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