您当前的位置: 首页 > 

阿里云云栖号

暂无认证

  • 0浏览

    0关注

    5305博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

玩转CocoaPods

阿里云云栖号 发布时间:2018-01-29 11:37:55 ,浏览量:0

摘要: 作者:阿里-移动云-大前端 CocoaPods作为iOS的依赖管理工具,已然成为iOS开发的标准工具(官方给出的数据,超过42W个库和300W个App使用了CocoaPods)。 本篇文章,非讲述CocoaPods的教学文章,而是围绕使用CocoaPods的两个主题:依赖管理Pod库发布,讲述些易忽略、混淆的关键点和不为熟知的用法。

点此查看原文:http://click.aliyun.com/m/41093/

作者:阿里-移动云-大前端

CocoaPods作为iOS的依赖管理工具,已然成为iOS开发的标准工具(官方给出的数据,超过42W个库和300W个App使用了CocoaPods)。 本篇文章,非讲述CocoaPods的教学文章,而是围绕使用CocoaPods的两个主题:依赖管理和Pod库发布,讲述些易忽略、混淆的关键点和不为熟知的用法。

执行pod env,可查看本地环境:

CocoaPods : 1.2.0
     Ruby : ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-darwin15]
 RubyGems : 2.5.1
     Host : Mac OS X 10.13.2 (17C88)
    Xcode : 9.2 (9C40b)
      Git : git version 2.14.3 (Apple Git-98)

1. 依赖管理

1.1 Podfile

Podfile是一个说明文件,描述一个或多个Xcode工程Target的依赖库,类似于Maven管理依赖的pom.xml文件。

Podfile可以很简单,也可以很复杂。

依赖版本号

依赖最新版本,不指定版本号:

pod 'TestSDK'

依赖指定版本,明确写明版本号:

pod 'TestSDK', '1.0'

使用逻辑运算符:

'> 1.0',版本号大于1.0。
'>= 1.0',版本号大于等于1.0。
'< 1.0',版本号小于1.0。
'):

'~> 1.0.1',版本号范围:1.0.1  1.0',版本号范围:1.0  0',版本号范围:0  'BSD' }
  spec.homepage     = 'https://github.com/tonymillion/Reachability'
  spec.authors      = { 'Tony Million' => 'tonymillion@gmail.com' }
  spec.summary      = 'ARC and GCD Compatible Reachability Class for iOS and OS X.'
  spec.source       = { :git => 'https://github.com/tonymillion/Reachability.git', :tag => 'v3.1.0' }
  spec.source_files = 'Reachability.{h,m}'
  spec.framework    = 'SystemConfiguration'
end

执行pod ipc spec xx.podspec,可将.podspec文件内容从Ruby转换为json格式:

{
  "name": "Reachability",
  "version": "3.1.0",
  "license": {
    "type": "BSD"
  },
  "homepage": "https://github.com/tonymillion/Reachability",
  "authors": {
    "Tony Million": "tonymillion@gmail.com"
  },
  "summary": "ARC and GCD Compatible Reachability Class for iOS and OS X.",
  "source": {
    "git": "https://github.com/tonymillion/Reachability.git",
    "tag": "v3.1.0"
  },
  "source_files": "Reachability.{h,m}",
  "frameworks": "SystemConfiguration"
}

2.2 私有仓库Push

CocoaPods仓库本质上是Git仓库,仓库里存储的是各pod库所有版本的.podspec或.podspec.json描述文件。 pod库上传,即对应Git仓库的commit提交。

Pod库上传到公共仓库,即向 公共Git仓库 提交commit。

因此,CocoaPods私有仓库的搭建,只需再准备一个Github/Gitlab仓库;具体搭建流程不再描述,可参考官网教程:CocoaPods - Private Pods。

执行pod repo push REPO [NAME.podspec]上传Pod库到私有仓库,REPO为私有仓库在本地的仓库名。 准备上传的Pod库,如果对其他pod库有依赖,需要在.podspec文件中声明dependency;同时执行pod repo push命令时,添加--source参数,声明依赖要查找的仓库地址;支持配置多个仓库地址,以,分隔。

例:

# 准备上传TestSDK到私有仓库PrivateSpec,仓库Git坐标:git@github.com/xx/xx-specs.git
# TestSDK依赖ASDK和BSDK,其中ASDK位于公共master仓库,BSDK位于私有仓库
# 上传TestSDK时执行命令如下:
pod repo push PrivateSpec TestSDK.podspec --verbose --allow-warnings --source=git@github.com/xx/xx-specs.git,git@github.com:CocoaPods/Specs.git

2.3 依赖冲突

如果只从CocoaPods master仓库拉取Pods,则不会有依赖冲突问题。依赖问题是由于引入三方私有CocoaPods仓库导致的。 首先来看pods依赖传递问题。

Pods依赖传递

假设TestSDK依赖ASDK和BSDK,工程引入TestSDK后,执行pod install 或 pod update,会将TestSDK、ASDK和BSDK一并拉取下来,这种可认为是依赖传递。

Pods依赖传递版本号管理

假设有依赖关系如下,TestSDK使用时,ASDK必须集成1.0.1版本,CSDK和ASDK(1.0.2)不能兼容。

TestSDK(1.0.2)

ASDK(1.0.2) BSDK(1.0.2) CSDK(1.0.1)

ASDK(1.0.1)

按下面的依赖配置,拉取下来的SDK版本如下,存在CSDK和ASDK不兼容问题。

TestSDK(1.0.2) ASDK(1.0.2) BSDK(1.0.2) CSDK(1.0.1)

pod 'TestSDK', '1.0.2'
pod 'CSDK', '1.0.1'

此时,需要显式指定ASDK版本号,拉取下来SDK版本如下:

TestSDK(1.0.2) ASDK(1.0.1) BSDK(1.0.2) CSDK(1.0.1)

pod 'TestSDK', '1.0.2'
pod 'CSDK', '1.0.1'
pod 'ASDK', '1.0.1'

依赖冲突问题

存在于同时集成master公共仓库和私有仓库时,或集成多个私有仓库时。

假设有两个私有仓库PrivateSpec1和PrivateSpec2,有SDK依赖关系如下,其中ASDK1和ASDK2是同一SDK的不同Pod封装。

PrivateSpec1:

TestSDK1(1.0.0)

ASDK1(1.0.0) PrivateSpec2:

TestSDK2(1.0.1)

ASDK2(1.0.1) 若同时依赖PrivateSpec1中的TestSDK1和PrivateSpec2中的TestSDK2,则ASDK1(1.0.0)和ASDK2(1.0.1)会冲突。

若Pods依赖支持类似Maven依赖的exclude,将ASDK1或ASDK2其中之一exclude,可解决该问题,但CocoaPods并不支持类似操作。

方法1,可手动集成TestSDK1或TestSDK2,将ASDK1或ASDK2删除。 方法2,仍通过Pods集成,但ASDK1和ASDK2必须修改为同一Pod标识,集成时显式指定ASDK版本号。

关注
打赏
1664438436
查看更多评论
0.0957s