cocoapods有个语法可以让我们引入多个spec源。
source "git@XXX_Specs.git"
source "git@YYY_Specs.git"
但是在依赖解析的时候,如果一个组件在不同源里面都有版本,并不能很好的解决源之间的优先级问题。
pod 'xxx',:source => "git@XXX_Specs.git"
虽然支持为每个组件指定source源的语法,但是这样做仍然有一些不方便。
cocoapods依赖解析原理简述
这里不做具体原理解析,只是初步概括一下关键步骤。假设我们依赖FMDB未指定源。
- 会获取所有源里面的FMDB和版本信息
- 筛选出满足要求的版本,比如'~> 2.6'
- 这个时候还会有很多版本满足要求
- cocoapods默认取满足要求的版本号里面的最大的正式版
举个具体的例子
- 依赖FMDB '~> 2.7.0',未指定源
- 私有源XX里面有FMDB
- 2.7.0
- 2.7.5
- 私有源YY里面有FMDB,但是和XX里面的不太一样
- 2.7.0
- 2.7.5
- cocoapods官方源里面有FMDB
- 2.7.0
- 2.7.5
这个时候会解析到2.7.5版本,且警告有多个源包含相同版本。具体使用哪个源,目前观察好像取决于source语法的顺序。
假设官方源突然更新
- cocoapods官方源里面有FMDB
- 2.7.0
- 2.7.5
- 2.7.6
如果这个时候没有Podfile.lock文件,则会解析到最新版本
辅助插件cocoapods-prefer
安装
直接安装
gem install cocoapods-prefer
或者使用Gemfile
source 'https://rubygems.org/'
gem 'cocoapods', '>= 1.8.4'
gem 'colored2','~> 3.1'
gem 'neatjson','~> 0.9'
gem 'cocoapods-prefer','~ 1.0'
使用
组件源提高优先级
require "cocoapods-prefer"
plugin 'cocoapods-prefer'
target 'Example' do
lock_source_with_url("git@github.com:DanboDuan/Test_Prefer_Specs.git") do
prefer_source_pod 'FMDB','~> 2.0'
prefer_source_pod 'xxx'
...
end
end
效果
- FMDB和xxx会优先使用指定的源,如果源内版本满足要求
- 如果源内没有版本满足要求,比如源内FMDB只有1.x版本,则不影响
组件源降低优先级
require "cocoapods-prefer"
plugin 'cocoapods-prefer'
target 'Example' do
lock_source_with_url("git@github.com:DanboDuan/Test_Dislike_Specs.git") do
dislike_source_pod 'FMDB','~> 2.0'
dislike_source_pod 'xxx'
...
end
end
效果
- FMDB和xxx会尽量不使用指定的源
- 如果只有指定源内版本满足要求,比如其他源都没有2.x版本,只有该源包含2.x版本。则不影响
优点
上面两个方法使用的好处在于
- 不需要给每个组件单独指定源
- 指定源不满足需求时,不会影响原有的逻辑
举个例子
pod 'xxx','~> 2.7.0',:source => "git@XXX_Specs.git"
如果这样单独使用,假设我准备升级版本到2.8.0,但是指定源里面没有该版本,则会报错。但是使用prefer插件,则不影响。等指定源里面又有2.8.0版本之后,又会使用指定源。
默认源提高/降低优先级
require "cocoapods-prefer"
plugin 'cocoapods-prefer'
prefer_source("Test_Prefer","git@github.com:DanboDuan/Test_Prefer_Specs.git")
dislike_source("Test_Dislike","git@github.com:DanboDuan/Test_Dislike_Specs.git")
target 'Example' do
pod 'Godzippa'
pod 'XcodeCoverage'
end
效果
- 这两个设置会对所有pod生效,前面的方法是对指定pod生效
应用
- 对于内部有多个组件源的场景,还是比较好用的
- 如果每个源里面每个组件都只有一个版本,则非常方便的管理所有组件的版本