iOS开发----cocoapods的那些事儿

一、了解cocoapods涉及知识点

cocoapods是用ruby写的iOS第三方库管理的工具,他就是Java中的Maven,Python中的pip。安装和使用依赖于ruby、gem、Mac OSX、xcode、cocoapods自身更新等。上述5个发生更新变化,cocoapods也可能随着变化,或者出现各种各样的问题。为了了解和解决这些问题,先了解下他们的概念和关系。

1、ruby、gem是什么?

ruby是一种跨平台脚本语言。是简捷的面向对象的多平台支持的脚本语言,Mac自带ruby环境,可以直接命令行输入ruby -v查看。(Mac有shell,win有bat)
gem是ruby软件包管理器。用ruby语言写的ruby应用或库叫ruby软件包,管理ruby软件包的东西叫RubyGems,也叫gems,就是命令行里的gem。
homebrew是基于ruby语言的macOSX系统级的软件包管理器。将软件包安装到独立目录,并将其文件软链接至/usr/local 。类似的系统软件包管理工具还有软件平台的Mac App Store/Setapp和基于命令行的HomeBrew/MacPorts/Fink(brew是基于ruby的,macports是基于shell的)
cocoapods是用ruby写的iOS第三方库管理的工具。

2、cocoapods是什么?工作原理是什么?

CocoaPods是用ruby写的iOS第三方库管理的工具。通过CocoaPods,我们可以更方便地管理每个第三方库的版本,而且不需要我们做太多的配置,就可以直观、集中和自动化地管理我们项目的第三方库。

CocoaPods的工作原理是:将所有依赖的库都放在一个名为Pods的项目下,然后让主项目依赖Pods项目,最终会编译为一个libPod-项目名.a静态库,主项目依赖于这个静态库。对于资源文件,CocoaPods 提供了一个名为 Pods-resources.sh 的 bash 脚本,该脚本在每次项目编译的时候都会执行,将第三方库的各种资源文件复制到目标目录中。CocoaPods 通过一个名为 Pods.xcconfig 的文件来在编译时设置所有的依赖和参数。

二、安装cocoapods

1、确认rvm

rvm是ruby version manager,先要确认rvm。指令:rvm -v。如果不存在(出现command not found字样),先要安装一下,安装指令是: curl -L https://get.rvm.io | bash -s stable

2、用rvm安装ruby环境

Mac有自带的ruby,但是很少用这个,通常自己安装。可通过指令 ruby -v检查当前版本,rvm list known 查询已知的ruby版本。安装指令:rvm install 2.6.3
安装完成之后输入指令rvm list查看ruby版本,看看是否安装成功。

3、确认gem

cocoapods等ruby软件包是由gem管理的,所以要先确认gem,然后用gem下载。
查看指令:gem -v
更新指令:sudo gem update --system

4、确认ruby源

确认可以从这个路径访问到一会我们需要下载的ruby软件包。
查看指令:gem sources -l
移除指令:gem sources --remove https://rubygems.org/
添加新源指令:gem sources --add https://gems.ruby-china.org
(国内镜像源的域名后缀已由.org改为了.com。具体可打开.org原网址查看)

5、准备就绪,开始安装

OS X 10.11之前系统的安装cocoapods 指令:sudo gem install cocoapods
OS X 10.11以后系统的安装cocoapods 指令:sudo gem install -n /usr/local/bin cocoapods

三、使用cocoapods

1、新建cocoapods项目

我们此次导入masonry,去官网查到的命令为pod ‘Masonry’
1.新建一个项目CocoapodsTest
2.cd到项目总目录(注意:包含CocoapodsTest文件夹、CocoapodsTest.xcodeproj的那个总目录),可以cd,然后直接把文件拉进去。
3.建立Podfile(配置文件)。终端输入vim Podfile然后enter,键盘输入i,进入编辑模式输入代码编写Podfile文件
platform :ios, ‘8.0’
target “CocoapodsTest” do
pod ‘Masonry’
end
然后按Esc,并且输入“ :”号进入vim命令模式,然后在冒号后边输入wq,保存并退出。(工程文件下多了一个Podfile文件)
4.下载安装pod install,完成之后打开文件目录多了几个文件:Podfile、Pods、Podfile.lock、CocoapodsTest.xcworkspace(之后再打开工程要点击该文件)
Receiving objects的漫长到崩溃等待过程中,工程目录下生成了Pods文件夹,/users/用户名/.cocoapods/repos目录下生成了master文件夹(文件夹中的内容会在Checking out files过程中生成)。

2、pod install和pod update使用

1.cocoapods官方指南

pod install vs pod update

简介

很多人刚开始用cocoapods,就会认为pod install只有第一次配置项目的时候用到,pod update会在之后经常用到,然而事实并非如此。本文的目的在于告诉你什么时候该用pod install,什么时候又该用pod update。

pod install用来向你的工程中添加新的库,哪怕你之前已经有Podfile且运行过install命令了,哪怕在你的工程中已经用它新增或者移除库过了。
pod update用来把你的库更新到新版本。

关于这俩命令的一点说明:就字面意思上来讲这俩命令的区别效果,并不只有在cocoapods中是这样的,还有一些其他的地方balabala…都有类似的作用。

pod install

这个命令常被用来第一次向工程中添加pod库时使用,但是之后每次对库的新增、更新、删除操作都要用到。

每次运行该命令,就会下载并安装新的库,并把安装好的每个库及其版本写入Podfile.lock文件,这个文件是用来记录已安装的库的版本并锁定这些版本。

当你运行install命令的时候,它只解决了一件事情就是:下载安装没有记录在Podfile.lock里面的一些库,有记录的就更新到lock中指定版本。(保持项目库和lock一致)

  • 如果你的库在Podfile.lock有记录锁定了版本号,他就会跳过查看库的更新版本直接下载Podfile.lock里指定的版本(无论超前和过时)。
  • 如果你的库没有在Podfile.lock中,他就会去搜索Podfile中的匹配版本,例如pod ‘MyPod’, ‘~>1.2’,下载安装并记录。
pod outdated

该命令会列出Podfile.lock里面已记录安装的但又有了更新可用版本的库。如果使用pod update PODNAME命令的话,会把项目中的库更新到Podfile里面限制的版本,像这样pod ‘MyPod’, ‘~>x.y’。

pod update

运行pod update PODNAME命令,会尝试寻找指定库的更新版本,而不管lock文件的版本限制,他会遵循Podfile的限制尽可能把库更新到Podfile指定版本。
如果运行pod update,没指定库名字,就会把Podfile中每一个库都更新到Podfile指定版本。

总结:install会根据Podfile把项目中的库指定到lock文件中的锁定版本,没有lock就创建并记录指定。update会根据Podfile把项目中的库更新到Podfile指定版本,并写入lock。

实用场景

当你只想更新某个库,用pod update PODNAME命令(最好提前查看一下是否有可用新版本)。pod install是不会更新已安装过的库的。

当你在Podfile添加了一个新库,应该用pod install,而不是pod update,因为update会更新正在使用的库,有风险。

update的使用场景是:你想更新已有库版本的时候。

提交Podfile.lock

尽管你不用提交pods目录到公开库,也得保持commit & push 你的Podfile.lock的习惯。否则的话,它就会打断上面所说的关于install锁定已装库版本的整个逻辑。

案例

下面用一个具体的案例说明一下一个人在项目开发中可能遇到的不同的实用场景。

  1. User1新建一个项目工程
    user1新建了一个工程,想用库A、B、C,就新建了一个Podfile,并把A、B、C都写进去,然后运行pod install。安装好的库A、B、C,我们假设版本都是1.0.0。这时候Podfile.lock就会记录A、B、C已安装并且版本号都是1.0.0。(另外,因为是第一次运行pod install,而且Pods.xcodeproj还没有,所以命令也会顺带生成Pods.xcodeproj 和 the .xcworkspace)

  2. User1新增了一个库
    后来user1想添加一个新库D到Podfile里面。这时候应该运行pod install,因为这样的话,即使是库B的维护者在此期间发布了库B的新版本1.1.0,能保证我们的项目仍然使用的是版本1.0.0,能规避掉一些库B的新版本带来的意外的风险。(一些人出错就是因为他们这里使用了update,请思考清楚你到底是想更新库还是添加库)

  3. User2加入了项目
    user2是新来的,以前没有接触过这个项目,加入进来了。首先使用pod install去clone the repository。
    Podfile.lock文件(应该已经被提交到git repo上)就能确保他们得到相同的库,和user1用的版本一致。
    即使现在库C有一个可用版本1.2.0,user2得到的也会是1.0.0。因为Podfile.lock文件已经记录并锁定了库C的版本是1.0.0。

  4. 检查某个库的新版本
    后来user1箱查看一些库是否用可用的新版本,运行了pod outdated之后发现,库B有新版本1.1.0,库C 有新版本1.2.0。
    user1决定更新库B但不更新库C,执行了命令pod update B。然后库B更新到了1.1.0,同时Podfile.lock也随之更新到1.1.0,而库C保持1.0.0不变。

只用Podfile指定版本是不足的

一些人可能会认为,像pod ‘A’, '1.0.0’这样在Podfile中指定确切的版本号已经足够确保团队里的每个人项目中库的一致性。
他们甚至还在仅仅只是新增一个库的时候用pod update命令,认为这样做没事,因为他们已经在Podfile里面制定了固定的版本。事实上,这不足以确保如上所述的案例中user1 和 user2俩人能始终获得一致的版本。

一个经典的例子是,库A依赖于库A2,在A.podspec中这样写dependency ‘A2’, ‘~> 3.0’。这种情况下,如果Podfile中写pod ‘A’, ‘1.0.0’,确实会让user1 和 user2俩人的库A都是1.1.0,但有例外:

  • user1 的库A2是3.4(可能是当时的最新版本)
  • user2加入项目之后install的时候可能会得到一个3.5版本的库A2(库A2在此期间发布了新版本)

所以确保团队成员在各自的电脑上保持版本一致性的唯一途径是:使用 Podfile.lock 并正确使用pod install 和 pod update。

2.cocoapods概念理解

Podfile.lock

第一次执行完 pod install 时产生,它包含的主要内容,是依赖库的版本号。

后缀.lock的意思就是锁定, 提交到代码仓库时,必需提交(官方也建议加入版本控制。)因为它锁定了,依赖库的版本号,当团队的其他人员执行pod install 的时候,就会按Podfile.lock 中相应依赖库的版本号更新。

Manifest.lock

Manifest.lock 是 Podfile.lock 的副本。

每次只要生成 Podfile.lock 时就会生成一个一样的 Manifest.lock 存储在 Pods 文件夹下。

在每次项目 Build 的时候,会跑一下脚本检查一下 Podfile.lock 和 Manifest.lock 是否一致。

Spec Repo

Spec是Git仓库,存放github上所有公开pods的索引目录,地址是https://github.com/CocoaPods/Specs。

Repo是本地仓库,执行 pod setup命令会clone git仓库存到本地的~/.cocoapods/repos目录下master中。(pod search)

仓库保存了依赖库的名称,版本号,以及spec文件。

3.cocoapods常用命令

pod install

遵循Podfile.lock指定的版本安装 Podfile 中新改变的依赖库。以Podfile.lock为主导,lock里没有的就从Podfile复制过来,lock有的就直接指定版本。
每次运行pod install命令的时候,在下载、安装新的库的同时,也会把你安装的每个库的版本都写在了Podfile.lock文件里面。总之一句话:pod install更新库到lock锁定版本

pod update

会根据 Podfile 的规则更新所有依赖库,不会理睬现有的 Podfile.lock,且会生成新的 Podfile.lock 文件来覆盖原来的。pod update更新库到Podfile指定版本,并更新lock

pod search

在本地的repo中搜索可用的Pods依赖库(可输入q退出显示)

pod repo update

更新本地cocoapods的spec索引目录信息。

pod init

为Xcode项目初始化pod(在项目路径下创建Podfile文件)

3、公开库和私有库

四、cocoapods使用中的问题和注意事项

1、cocoapods遇到问题

1.pod install 超级慢

慢的原因是pod setup过程,就是从https://github.com/CocoaPods/Specs,下载索引目录很慢。解决方法有俩:一个是从同事、朋友或网上找一份索引目录,然后拷进自己的repos文件夹。一个是通过各种办法给网络加速。

2.添加新库,install和update name 有区别么

install会更新到lock版本,update会更新到podfile版本或repo版本,并更新lock。

3.podfile和podfile.lock不一样,install和update听谁的

install会听lock,update会听podfile并更新lock

4.pod search name 报错Unable to find a pod with name

第一次install成功了之后,显示也有Setup completed。但是之后仍然报错
Unable to find a pod with name, author, summary, or description matching Masonry。
解决:删除 ~/Library/Caches/CocoaPods 目录下的 search_index.json 文件
原因:pod search的时候会生成search_index.json文件,会主动记录之前搜索的行为存在本地,所以一般第二次搜索会比第一次快。第一次search的时候还未Setup成功,所以搜索失败了,这一次尝试被缓存文件记住了,之后搜索同样的字符会先调用缓存文件中的记录,所以仍失败。删除缓存文件即可。

2、第三方库问题

1.不知名三方库维护差易出问题怎么办

踢出cocoapods,拉到本地,或者自己动手写。

3、注意事项

1.install看lock,update看podfile。新增删除用install,更新用update name。
2.podfile.lock要提交。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值