cocoapods source辅助插件

2,890 阅读3分钟

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生效

应用

  • 对于内部有多个组件源的场景,还是比较好用的
  • 如果每个源里面每个组件都只有一个版本,则非常方便的管理所有组件的版本

补充