CocoaPods 私有库
CocoaPods
模板类库开发 - 关于私有库
这篇笔记主要用来记录自己在实现开源库和私有库`CocoaPods`托管过程中
从产生疑问 -> 最终理解 这一个过程的总结
有关
pod lib
的基本使用, 参考 CocoaPods模板类库开发
疑问
- [ ] 1.
pod trunk push
和pod 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
的过程中
- 我们通过
Podfile
配置依赖库 - 执行
pod install
来安装依赖库 - 在安装过程中会根据
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 <索引库>
这一步骤的时候就是加了一个包管理器的源而已, 类似于用npm
、RubyGems
这些包管理器换源一个道理, 大多数的包管理器是换源, 这个是添加一个源
所以 疑问1
、疑问2
和疑问4
也就解决了
- [x] 1.
pod trunk push
和pod repo push
本质区别是啥? - [x] 2.
pod repo push <私有索引库> <源码仓库地址>
这一步骤可选, 这一步骤存在的意义是什么? - [x] 4.
索引库
是个啥?
在理解疑问3
前, 先思考一下几个使用场景
通过
pod lib
开发类库时, 默认我们的Demo
项目是直接通过:path => '../
直接指向本地资源使用的实现私有库前, 只创建一个仓库, 让索引库和源码库共用一个仓库
实现私有库, 创建两个仓库, 一个作为索引库, 另外一个作为源码库
首先, 基于场景1
的实现, 也就是说我完全可以将自己的项目、分拆成lib
的组件存在同一个仓库中来进行管理, 那这样会有什么问题?
使用pod lib
模板, 项目结构是
workspace
|
├── project (demo)
|
└── project (lib)
仿照这种结构, 完全可以通过多project
依赖的方式来分开业务实现多个lib
依赖, 但是版本控制可能是个问题, 虽然业务间进行了隔离提取, 但是可用性并不好, 脱离项目复用也是个问题
直接指定本地资源了, 只要配置好podspec
, 代码都绑定项目和仓库了, 是否需要索引库也就不那么重要了
场景2
和场景3
我通过pod lib
来完成每一个组件的开发, 并为其提供demo
- 每个源码库即索引库
- 每个源码库仅仅作为源码库, 额外新建一个私有库作为索引库
实现上, 感觉都没啥问题, 我觉得有必要单独一个索引库的好处就是在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
的使用理解还不够透彻, 如有错误还请及时指出