玩转CocoaPods

摘要: 作者:阿里-移动云-大前端 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.0Ruby : ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-darwin15]RubyGems : 2.5.1Host : 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.0

使用optimistic operator (~>):

'~> 1.0.1',版本号范围:1.0.1 <= version < 1.1
'~> 1.0',版本号范围:1.0 <= version < 2.0
'~> 0',版本号范围:0 <= version,无意义

实际使用时,可根据项目需求,灵活配置依赖版本号。

Hook

Podfile中可配置钩子函数,在依赖库安装过程中会被调用。主要有两个Hook函数:pre_install和post_install,接收的参数为:Pod::Installer,分别对应Pods工程安装前和安装后。

pre_install配置示例如下:

pre_install do |installer|puts '[Test] - pre_install here'
end

post_install配置示例如下,Pods工程安装后,读取打印iOS deploy target默认配置,并将其修改为8.0。

post_install do |installer|puts '[Test] - post_install here'installer.pods_project.targets.each do |target|target.build_configurations.each do |config|puts "[Test] - config:" + config.name +  ", deploy target: " + config.build_settings['IPHONEOS_DEPLOYMENT_TARGET']config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '8.0'endend
end

1.2 pod install vs. pod update

Podfile.lock

该文件用来记录和追踪生成的Pod版本。
pod install

每次执行pod install,都会重新下载并安装pods。
pods的版本号从Podfile.lock文件中获取:

有记录的pods,直接下载安装该记录版本号的pods,不检查对应pods是否有更新;(已经安装的pods不会更新其版本)
无记录的pods,查找下载并安装满足Podfile中指定版本号条件的pods。
pod update

完整命令为:pod update [PODNAME],执行命令后,CocoaPods会无视Podfile.lock锁定的版本号,查找并更新到,满足Podfile中指定版本号条件的最新版本pods;若没有指定PODNAME,默认更新Podfile中全部pods。
pod outdated

满足Podfile中指定版本号条件下,列出比Podfile.lock中记录锁定的版本号新的pods。
实际执行pod update命令时,更新的pods即为执行pod outdated列出的pods。
建议用法

工程首次执行pod installpod update,执行效果一致。
需要安装新添加pod,建议执行pod installpod update [NEW_POD],已安装的其他pods版本不变,否则可能由于版本更新的不确定性引起适配问题。
明确更新某pod版本时,执行pod update [PODNAME],明确更新全部pods版本时,执行pod update

1.3 pod cache

pod cache list [NAME]

可列出本地pods缓存记录,执行pod installpod update时,若命中缓存记录,则直接从本地拉取。

pod cache clean [NAME]

删除本地pods缓存记录。
执行pod cache clean –all,删除全部缓存记录。
例:从私有CocoaPods仓库拉取TestSDK v1.0.1,该记录添加到本地缓存;由于某些原因TestSDK使用同样的版本号v1.0.1做了覆盖发布,可以先执行pod cache clean TestSDK,然后再执行pod update,保证拉取到最新版本的v1.0.1 SDK文件。

2. Pod库发布

CocoaPods除了做依赖管理外,也会将自实现的pod库上传到公共仓库/私有仓库。

2.1 podspec

podspec文件,即Pod Specification(Pod描述文件),描述指定版本的pod库信息,包括:pod库源码地址、文件列表、配置信息、描述信息等。

执行pod spec create,可创建生成.podspec文件,其为Ruby语法格式,修改后如下,例:

Pod::Spec.new do |spec|spec.name         = 'Reachability'spec.version      = '3.1.0'spec.license      = { :type => '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版本号。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/522834.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一张图看懂阿里云新发布的物联网设备上云神器——HiTSDB + IoT套件

近日&#xff0c;阿里云针对物联网企业遇到的设备认证困难、安全问题突出等问题&#xff0c;发布了HiTSDB IoT 套件的一体化解决方案&#xff0c;能够支持物联设备快速上云&#xff0c;高效设备管理&#xff0c;数据安全&#xff0c;低成本海量数据存储&#xff0c;实时掌握设备…

flowable实战(三)flowable流程实例管理接口

文章目录一、流程实例的管理接口常见功能&#xff1a;1.启动一个流程&#xff08;即创建一个流程实例&#xff09;2.本人发起的流程实例3.本人参与的流程实例4.挂起/激活流程实例5.提前终止流程实例&#xff08;或又叫撤销流程&#xff09;6.彻底删除流程实例7.流程图查看8.判断…

java jtable不可编辑_java – 使JTable单元不可编辑

当用户双击时,我试图使JTable的所有单元格都不可编辑.我已经阅读了很多论坛帖子,一般的共识是创建一个新的表模型类,扩展DefaultTableModel然后重写方法isCellEditable(int row,int column).我做了所有这些,现在当我运行我的程序(小程序)时,没有任何东西出现在单元格中.注意我这…

Spark精华问答 | 谈谈spark中的宽窄依赖

总的来说&#xff0c;Spark采用更先进的架构&#xff0c;使得灵活性、易用性、性能等方面都比Hadoop更有优势&#xff0c;有取代Hadoop的趋势&#xff0c;但其稳定性有待进一步提高。我总结&#xff0c;具体表现在如下几个方面。1Q&#xff1a;Spark RDD是什么&#xff1f;A&am…

阿里云产品头条(2017年12月刊)

摘要&#xff1a; 一、新产品发布1、云防火墙 商业化 发布云防火墙是一款云环境下的防火墙产品&#xff0c;首创了基于业务可视的结果&#xff0c;实现业务梳理和业务隔离的技术。适用于互联网&#xff0f;通用&#xff0f;游戏&#xff0f;金融&#xff0f;新零售&#xff0f;…

一张图解读阿里云数据管理DMS企业版

摘要&#xff1a; 阿里云数据管理DMS企业版&#xff0c;作为数据管理产品大家族里的新成员&#xff0c;于2017年11月开启公测&#xff0c;今年1月底正式发布商业化版本。 作为业界领先的面向企业的数据库DevOps解决方案&#xff0c;DMS企业版旨在帮助企业安全、高效的使用数据库…

flowable实战(四)flowable任务实例管理接口

文章目录1. 任务办理模式分两种1.1. 一种直接办理模式1.2. 一种需要签收后再办理2. 转办任务3. 委派任务与代办任务4. 待办任务列表5. 待办签收列表6. 抄送任务7. 终止任务&#xff08;这个功能放到流程实例中&#xff09;8. 催办任务9. 驳回10. 超时自动跳转完成11. 任务按业务…

架构设计之「 微服务入门 」

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 奎哥来源 | 不止思考微服务这几年不可谓不火&#xff0c;很多技术团队都开始在自己的项目上引入了微服务。一方面这些团队确实很好的推动了微服务的应用和发展&#xff0c;另一方面也可以看到一些盲目追技术热点的行为所带来…

Java语言中提供了三个日期类_Java语言学习(5)-Java中基础封装类(日期、时间类)...

日期和时间封装类1、 Data类Java日期和时间采用Data类。Data类在java.util包中。Data类构造函数&#xff1a;1) Data() 采用当前时间初始化对象&#xff1b;2) Data(long millisec) 采用1970年1月1日起时间毫秒数来初始化对象。Data类的方法&#xff1a;1) …

提升研发效率 保障数据安全——阿里云宣布数据管理DMS企业版正式商业化

摘要&#xff1a; 阿里云数据管理DMS企业版&#xff0c;作为数据管理产品大家族里的新成员&#xff0c;于2017年11月开启公测&#xff0c;今年1月底正式发布商业化版本。 作为业界领先的面向企业的数据库DevOps解决方案&#xff0c;DMS企业版旨在帮助企业安全、高效的使用数据库…

flowable实战(五)flowable驳回/退回上一步/退回到

一、驳回/退回上一步/退回到&#xff08;历史某一个节点&#xff09; 我们经常需要工作流中退回上一步&#xff0c;或者退回历史某一个节点。但由于流程的场景是很复杂的&#xff0c;回退有以下一些场景&#xff1a;1.串行路线上的退回&#xff1a;流程中没有任何网关&#xff…

全链路压测一招搞定,阿里云性能测试铂金版发布

摘要&#xff1a; 阿里云性能测试&#xff08;Performance Testing Service&#xff09;是卓越的SaaS性能测试平台&#xff0c;具备强大的分布式压测能力&#xff0c;可模拟海量用户的真实业务场景&#xff0c;让所有性能问题无所遁形。近日&#xff0c;PTS宣布推出了基于阿里双…

老司机教你分析日志:分析用户的地理位置信息

摘要&#xff1a; 地理位置的需求 通常我们分析用户的需求&#xff0c;了解到用户当前位置在哪里非常重要&#xff0c;例如&#xff0c;可以根据用户的地理位置&#xff0c;针对性的推广本地广告。 通常&#xff0c;我们可以在客户端获取定位权限来获取GPS信息。但是如果用户关…

java中的switch的规则_细细讲述Java技术开发的那些不为人知的规则

本文介绍的Java规则的说明分为3个主要级别&#xff0c;中级是平时开发用的比较多的级别&#xff0c;在今后将陆续写出其他的规则。遵守了这些规则可以提高程序的效率、使代码又更好的可读性等。一、在finally方法里关掉input或者output资源方法体里面定义了input或者output流的…

华为,百度豪投,这类程序员要再次上榜了!

前不久百度AI开发者大会&#xff0c;李彦宏高调宣布百度AI技术&#xff1b;同时&#xff0c;AI测试权威软件AI Benchmark的测试数据显示&#xff0c;中国华为研发的7nm旗舰手机芯片麒麟810的AI分数&#xff0c;远远超过美国高通骁龙855了&#xff01;早前华为就宣布&#xff1a…

认识阿里云的产品逻辑:基础设施必须必业务跑得快

摘要&#xff1a; &#xff08;本文根据海峰姐与狒哥的E企播报的直播访谈中进行整理解读&#xff1a; 原文来源&#xff1a;E企播报&#xff1a;阿里云、华为存储重压全闪存&#xff0c;英特尔美光劳燕分飞 作者&#xff1a;海峰姐 狒哥 地址&#xff1a;https://mp.weixin.qq.…

flowable实战(六)flowable的意见表和附件表应用

一、act_hi_comment和act_hi_attachment两表表&#xff0c;前者意见表后者是附件表 意见表它里面有一个类型type字段&#xff0c;分别是comment代表意见(这个type可以自定义,例如自定义为&#xff1a;通过/退回/提前终止&#xff09;&#xff0c;缺省提供了comment&#xff0c…

Serverless在游戏、电商行业的一个运用场景示例

摘要&#xff1a; Serverless 是一种架构理念&#xff0c;具有自己的独特的优势和适用场景。本文以使用阿里云函数计算为例&#xff0c;构建一个简单具体的microservice为例&#xff0c;看看这种架构是如何达到快速开发和节约运维成本的。 点此查看原文&#xff1a;http://clic…

java没有这样的元素异常_java – 没有这样的元素异常?

所以这是我的代码&#xff1a;public static void getArmor(String treasure)throws FileNotFoundException{Random randnew Random();Scanner filenew Scanner(new File ("armor.txt"));while(!file.next().equals(treasure)){file.next(); //stack trace error her…

SDN精华问答 | SDN的核心技术是什么?

SDN火热了好一阵子&#xff0c;无论运营商、政府企业、投资机构&#xff0c;一段时间&#xff0c;不知道SDN、不能甩几个SDN相关的名词术语&#xff0c;似乎都落后于时代了。今天&#xff0c;就来看看关于SDN的精华问答吧。1Q&#xff1a;SDN的目的是什么&#xff1f; A&#x…