Cocoapods的Podfile使用

对于第三方库集成,现在最受欢迎的就是基于Ruby语言实现的Cocoapods,可以很方便的管理引入库,当然你也可以使用Swift Package Manager 或者 Carthage。 现在我们来看看有哪些使用姿势。

如何创建Podfile

创建Podfile文件有很多种方式,最简单的方式应该是打开终端进入项目路径,执行pod init命令,会自动添加target等提示信息。

# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'target 'XXXX' do# 使用use_frameworks! 表示使用动态库, 不使用的库就添加在use_framworks!之前use_frameworks!# Pods for XXXXtarget 'XXXTests' doinherit! :search_paths# Pods for testingendend

或者你想要一个赶紧(空白的)Podfile, 你有可以执行touch Podfile创建文件,open Podfile /vim Podfile 打开文件之后编辑,附上一份vim命令速查

Podfile编辑

Cocoapds Podfile 语法指南

source

source用来指定Specs的地址,需要注意一下两点:

  1. 具有顺序关系,Cocoapods会使用pod第一次出现的source的最高版本,哪怕之后的source有更高版本,也不考虑了。
  2. 官方source默认[地址:https://github.com/CocoaPods/Specs.git]是隐式的,如果你指定其他source,你就需要把官方也指定
source 'https://github.com/aliyun/aliyun-specs.git'
source 'https://github.com/CocoaPods/Specs.git'

Tips: 有时候官方source 索引较慢,可是替换使用国内一些索引,比如清华大学CocoaPods索引 giteeCocoaPods 索引

CocoaPods 1.7.2 提供CDN功能,目标是为了不用更新所有master索引库,而默认使用cdn来加载你需要的索引,按照道理速度会快很多,但是你可能会遇到" CDN: trunk URL couldn’t be downloaded: https://cdn.cocoapods.org/deprecated_podspecs.txt, error: Failed to open TCP connection to cdn.cocoapods.org:443 (No route to host - connect(2) for “cdn.cocoapods.org” port 443)"这个问题,你可以尝试将source添加:

source 'https://cdn.cocoapods.org/‘

取消依赖库警告

可以通过使用inhibit_all_warnings!来取消库编译警告,对于强迫症来说简直福音。

use_frameworks!

通过添加这个命令,使得通过frameworks的方式来管理pod的代码,可以动态调试,不配置默认采用静态库方式来管理。由于Swfit只支持动态库,所以Swift的Podfile都会使用。

Tips:如果是OC和Swift混编,OC的库也建议使用use_frameworks!,但是需要注意的是不要在桥接文件中引入[用到的是源码不是framework,编译速度慢],而是和Swift一样,在需要使用的文件中引入[引用的是framework,编译速度快]

指定依赖库版本

OC项目可以不用指定,默认使用最新的。但是Swift项目建议务必指定,不然Swift语言本身的版本变化会造成相应库的变动。

固定版本

 pod 'moya', '13.0.1'

区间版本 Swfit推荐

控制运算符'~> 版本号1.版本号2.版本号3',表示从指定版本到倒数第二个版本号升1未知,比如 '~> 1.2.1’是指 1.2.1 <= 版本 < 1.3.0

比如

  pod 'moya', '~>13.0.1' #表示 [13.0.1,13.2.0)

添加依赖库指定

指定本地库

除了可以依赖远程库,同时可以依赖本地库或者私有库,只需要指定路径即可

pod 'LFKit',:path => '本地库地址'

指定索引

pod ‘库名’, :podspec => ‘podspec文件路径’

指定git地址

pod ‘库名’, :git => ‘源码git地址’

pod 'Alamofire', :git => 'https://github.com/Alamofire/Alamofire.git'

Tips: 由于github 服务器在国外,下载很慢,可以使用Gitee 镜像,速度就很快 比如 Alamofire 就可以使用 pod 'Alamofire', :git => 'https://gitee.com/mirrors/alamofire.git' 这样就会去Gitee 下载代码。
指定tag

pod ‘库名’, :tag => ‘tag名’

pod 'Alamofire', :git => 'https://github.com/Alamofire/Alamofire.git', :tag => '3.1.1'

指定commit

pod ‘库名’, :commit => ‘commit唯一码’

pod 'Alamofire', :git => 'https://github.com/Alamofire/Alamofire.git', :commit => '0f506b1c45'

指定分支

pod ‘库名’, :branch => ‘分支名’, 默认是master

pod 'Alamofire', :git => 'https://github.com/Alamofire/Alamofire.git', :branch => 'dev'

def 定义模块组

当项目中引入很多库,或者有多个target时,就可以定义模块,将库分组方便管理。

# Uncomment the next line to define a global platform for your project
platform :ios, '9.0'# 基础依赖库
def common  ## 注意: 命名只能小写开头# 添加一些技术基础库,比如与业务无关。网络库,HUD等
end# 业务库
def business# 比如地图SDK, 支付SDK等
end# Swift库
def swift_frameworks# RxSwift 等
End# Objective-C库
def oc_frameworks# OC编写的库
endtarget 'app1' douse_frameworks!commonbusinessswift_frameworksoc_frameworks
end
target 'app2' douse_frameworks!common
end

post_install

post_install属于pod 的HooK(钩子,相当于闭包)操作,你可以在里面进行Xcode项目设置的更改。

pod install

按照Podfile下载安装新的pod, 为Podfile.lock进行pod的增删和锁定,不尝试版本更新和检查。千万不要以为只有在项目创建的时候才使用pod install. 如果执行pod install 存在Podfile.lock 会按照lock文件版本信息安装pod
什么时候使用:
*. 第一次创建Podfile时
*. Podfile文件更新,对Podfile进行依赖库的新增、删除、更改等操作后
着重点是pod的增删。

pod update

执行pod update时,cocoapods尝试查找 Podfile中最新符合版本,而不考虑Podfile.lock中的版本,将对pod进行最新符合版本更新。
pod update 库名 更新指定库到符合最新。
着重点是pod版本的更新。
可以使用pod outdated 查看哪些pod具有更新版本。

Podfile.lock作用

我们在编辑好Podfile之后,pod install 就会产生一个Podfile.lock文件。Podfile.lock用于锁定依赖库版本和信息,同时你还可以借助

Podfile.lock查看第三方库的依赖库和详细版本号,对于协同开发来说非常重要,是保证依赖库版本一致的根本。

团队协同开发时,建议将.lock文件加入到版本控制,保证团队pod的一致性。

pod 与 git合作

在使用git版本管理时,应该创建忽略文件忽略pod依赖创建Pods文件,只提交Podfile和Podfile.lock。

合并代码每次都要pod install问题解决

有一段时间,小伙伴内总是代码,编译代码都提示需要pod install一下, 同时执行pod intall 发现Podfile.lock有更新记录,提示要提交。

通过对比发现,原因是libwebp库通过默认索引无法更新,需要手动修改cocoapods中对应json配置文件source的git地址libwebp本地替换源,而该小伙伴的没有修改(每次同步远程索引都需要手动修改),所以导致lock文件内该库唯一码不一致。所以导致团队内每次合并都需要pod install

所以,你们遇到每次合并都需要pod install,请做一下检查

  1. 检查团队内 pod --version 版本是否一致,如果不一致,可以先统一。
  2. 通过版本控制对照.lock文件差别,针对pod 依赖不同的做处理。

问题解决

Podfile格式为unix怎么办

有时候,协同开发或者git clon代码时,想要编辑Podfile,突然发现它是一个黑东西(如下图),还不能直接打开编辑。不要慌张,只需要改变一下文件权限即可。

**终端进入项目文件目录,执行chmod 644**命令文件就变为可编辑的了。详情可参考linux文件权限

cocoapods 版本冲突

按照道理,统一团队开发环境是必要的,但是总有千万种理由可能导致 pod.lock 文件的 cocoapods 版本不一致,或者某个开发者电脑中有多个版本的 cocoapods(列举所有 cocoapods版本:gem list --local | grep cocoapods)。

我们应该借助 Bundler来统一项目环境的 cocoapods。已解决多个 cocoapods 问题。

Bundler: 是一个管理 Gem 依赖的 Gem,用来检查和安装指定 Gem 的特定版本,它可以隔离不同项目中 Gem 的版本和依赖环境的差异。

你可以执行 gem install bundler 命令安装 Bundler,接着执行 bundle init 就可以生成一个 Gemfile 文件,你可以在该文件中指定 CocoaPods 和 fastlane 等依赖包的特定版本号,比如:

source "https://rubygems.org"
gem "cocoapods", "1.10.0"
gem "fastlane", "> 2.174.0"

然后执行 bundle install 来安装 Gem。Bundler 会自动生成一个 Gemfile.lock 文件来锁定所安装的 Gem 的版本。

这一步只是安装指定版本的 Gem,使用的时候我们需要在 Gem 命令前增加 bundle exec,以保证我们使用的是项目级别的 Gem 版本(也就是 Gemfile.lock 文件中锁定的 Gem 版本),而不是操作系统级别的 Gem 版本。

$ bundle exec pod install
$ bundle exec fastlane beta

pod install/update很慢怎么办?

首先知道为什么会慢,主要有两个原因,

更新远程索引库花费时间(可避免),

比如团队开发,某位同事更新了依赖库版本,此时pod.lock文件就会有变化,运行时就要求执行pod install。 如果lock文件中某个依赖版本号。本地库索引不包含,就需要更新索引pod repo update,然而这个会更新.cocoapods下所有索引库,众所周知,pod master的索引库更新相当慢,或者更可能造成过个更新失败。
当本地索引库的对应三方库版本小于 podfile/pod.lock 文件指定版本时,就需要更新远程索引库到本地,这个过程也是极其费时的。

解决

方案一【推荐】: Podfile source 指定国内索引库地址,比如 Gitee 镜像

# 使用 Gitee 索引库镜像
source 'https://gitee.com/mirrors/CocoaPods-Specs.git' # https://github.com/CocoaPods/Specs.git

方案二【pod 一直失败时】:手动将远程需要更新的文件复制到本地。

​ 比如将 Moya 更新到 14.0.0

find 命令查找目标库位置

find ~/.cocoapods/repos/master -iname moya

​ 输出位置:/Users/xxx/.cocoapods/repos/master/Specs/8/a/7/Moya

在远程索引库https://github.com/CocoaPods/Specs找到对应的库的版本 podspec.json 文件如下图:

复制本地索引库,注意需要新建版本号文件(其实你可以可以直接本地复制修改版本号,文件名和 json的版本号).

下载依赖库需要时间

在执行 pod update/pod install 之后 如果本地没有代码资源,都会去对应 git 地址下载,也是很费时间,甚至可能失败。

比如出现下面死亡信息

[!] Error installing lottie-ios
[!] /usr/bin/git clone https://github.com/airbnb/lottie-ios.git /var/folders/k0/dlsny07d6mn3xsjkb64mn69r0000gn/T/d20201203-8189-1v8bag3 --template= --single-branch --depth 1 --branch 2.5.3Cloning into '/var/folders/k0/dlsny07d6mn3xsjkb64mn69r0000gn/T/d20201203-8189-1v8bag3'...
error: RPC failed; curl 18 transfer closed with outstanding read data remaining
fatal: the remote end hung up unexpectedly
fatal: early EOF
fatal: index-pack failed

解决

方案一【推荐】:Podfile 指定国内 gitee 镜像

`pod 'Alamofire', :git => 'https://gitee.com/mirrors/alamofire.git'

速度就蹭蹭蹭,完事。

方案二: 先使用 Gitee 镜像下载代码,然后再删除。

有时候由于项目历史原因或者多人协同开发, 不能更改仓库地址为 gitee 的,但是在下载代码总是失败,可以先添加,等执行成功后再删除 gitee 的镜像地址,本地就有代码了。

方案三:手动将同事 Pods 目录下对应库相关文件复制过来。

pod install的实质是把本地电脑的/Users/xxx的电脑/.cocoapods/repos/master/Specs/8/a/7/Moya里面的描述文件拷贝到/Users/xxx的电脑/Library/Caches/CocoaPods/Pods/Specs/Release/Moya

所以我们自己执行这个操作,把描述文件的名字改为3.3.podspec.json(取版本号的前2位。如果版本号有n位,这里就写到n-1位就行)。

拷贝源码。我们把从github下载下来的源码或者同事那里拷贝过来的MJRefresh的3.3.1的源码放到/Users/xxx的电脑/Library/Caches/CocoaPods/Pods/Release/Moya文件夹,

这里要特别注意一点。此文件夹的名字大有讲究,一定要是版本号-xxxx。如3.3.1-542f。前半部分是版本号,后面是一串字符串,这个字符串不能乱改,一定要是对的。这个后面看起来像随机字符串的字符串其实不是随机的,是跟版本号唯一绑定的,目前不知道它的生成规则。所以你从同事那里拷贝的话,最好把这个文件夹名字一起拷贝过来。

其他技巧

pod update 添加 --verbose --no-repo-update
默认pod update 是需要更新索引库的,所以可以添加选项不更新。【–verbose 详情 --no-repo-update 不更新远程】

同理,pod install 也可以,不过 pod install 默认不会更新远程,所以没必要。
pod install --verbose --no-repo-update
更新指定索引库
如果项目存在多个索引库(比如私有库),可以通过版本控制查看哪些库对应的索引库需要更新。执行pod repo update 指定索引库或者pod repo update /Users/用户名/.cocoapods/repos/指定索引库 比如 pod repo update master更新master索引库。

怎么查找依赖库路径

依赖库的索引在Specs下的多级各种数字字母文件下,怎么快速找到我依赖的库路径了。使用shell find命令。
find 路径 -name "名字" 在路线下查找指定名字的文件
find 路径 -iname "名字" 在路径下查找忽略文件名(不区分大小写)文件
找索引的路径就是:/Users/用户名/.cocoapods
比如查找Moya在哪个路径下

mac:~ Sven$ find /Users/Sven/.cocoapods -iname "moya"
/Users/Sven/.cocoapods/repos/master/Specs/8/a/7/Moya

参考

Cocoapods官网 Podfile 语法指南

什么时候使用pod install和pod update

解决 cocoapods 更新某个库总是失败的问题

开发环境:如何使用 Ruby 工具链统一开发环境?

一整套 iOS 开发环境统一管理的说明,包含统一配置脚本,各个工具和环境应该如何让统一。非常具有借鉴意义。

Cocoapods的Podfile使用相关推荐

  1. 解决 项目cocoapods diff: /../Podfile.lock: No such file or directory

    解决cocoapods diff: /../Podfile.lock: No such file or directory 最近把以前代码放到新电脑上运行,在执行pod update之后build工程 ...

  2. Cocoapods的Podfile常见语法总结

    source  'URL' : 指定镜像仓库的源 platform : ios,  '6.0'  : 指定所支持系统和最低版本 inhibit_all_warnings! :屏蔽所有warning w ...

  3. swift使用cocoapods导入oc三方库

    这里主要说几个关于cocoapods导入三方库需要注意的问题和我遇到的坑 1.Swift语言使用cocoapods配置Podfile文件时要加上use_framework!这句代码,作用是把三方库打包 ...

  4. The podfile

      ------------注:(非海腾原创) 前言 经常使用CocoaPods来管理iOS项目中的第三方库,但是我们要使用CocoaPods来管理第三方库,前提是要写好Podfile文件,通过这个文 ...

  5. cocoaPods多版本安装

    一.前言 公司的项目需要特定的cocopods版本才能正常集成,用其他版本运行会报错,但再做新项目时必须要最新的cocopods版本才行,所以每次都是卸了重装cocopods,很是麻烦,消耗了大量的时 ...

  6. Podfile文件详解

    经常使用CocoaPods来管理iOS项目中的第三方库,但是我们要使用CocoaPods来管理第三方库,前提是要写好Podfile文件,通过这个文件来配置第三方库与项目之间的依赖.版本等信息. 但是, ...

  7. iOS-FXDanmaku弹幕库介绍、相关技术分享

    前言 去年, 2016年, 一大波直播平台在移动端涌出, 直播慢慢步入了人们的视角. 网上如今能够看到各式各样的直播, 如秀场直播.游戏直播.体育直播.娱乐直播等等. 在各种类型的直播中, 弹幕在PC ...

  8. swift通知栏推送_如何使用Swift和Laravel使用推送通知创建iOS加密跟踪应用

    swift通知栏推送 by Neo Ighodaro 由新Ighodaro 如何使用Swift和Laravel使用推送通知创建iOS加密跟踪应用 (How to create an iOS crypt ...

  9. 从零开始制作自己的podspec

    2019独角兽企业重金招聘Python工程师标准>>>  前言:CocoaPods相关资料 Commands: + repo       Manage spec-repositor ...

最新文章

  1. 【分享】博士生提高科研幸福感的途径
  2. iBATIS教程之like语句的写法浅析
  3. flash动画制作成品_flash动画制作
  4. 【php】php5.0以上,instanceof 用法
  5. java 事件监听器是组件_JavaWeb的三大组件之事件监听组件(Listener)
  6. selenium 翻页_利用selenium实现自动翻页爬取某鱼数据
  7. Codeforces Round #371 (Div. 2) C. Sonya and Queries —— 二进制压缩
  8. 微生物组-扩增子16S分析第9期(报名直播课免费参加线下2020.8)
  9. 研究生必须过计算机和英语吗,计算机考研考英语一还是英语二
  10. TikZ绘图示例——尺规作图:直角的画法(一)
  11. 深度学习画图软件收集
  12. Kaptcha 使用
  13. Java 他们每人单独过桥的时间是_java实现 n人过桥问题
  14. 深入浅出解析变分法——一种常用的数学方法
  15. 苹果cms模板_苹果cmsv10高端模板有哪些?
  16. linux 百度云 备份软件下载,Linux 安装百度云,自动备份服务器资料
  17. php一些单选、复选框的默认选择方法
  18. java上传文件的要点_Uploadify上传文件方法
  19. 战斗系统之属性设计(一)
  20. 还原精灵还原了mysql怎么办

热门文章

  1. python windows系统_python管理windows系统tomcat服务
  2. windows环境下搭建rabbitMQ开发环境
  3. 开发经理 VS 敏捷专家
  4. OpenStack(Kilo版本)基础架构学习笔记
  5. [译]开始对Angular App进行单元测试(1)
  6. HDU 1028 HDU Ignatius and the Princess III
  7. nfs自动挂载报错及解决方法
  8. 探索.NET中事件机制(续)——虚事件和事件重写问题,微软的Bug?!
  9. 数据恢复knowledge
  10. win 2003 IIS如何防止代码注入