团队管理cocoapods版本

916 阅读4分钟

统一Ruby环境

在日常的开发工作中,总会遇到小伙伴的cocoapods的版本不一致导致拉取代码后pod install失败,或者不同的项目使用的cocoapods版本不同,再或者自己的项目使用的cocoapods版本与公司项目的版本不同,只能被迫统一成公司的pod版本。

那么,我们怎么避免这样的情况发生呢?怎么才能在不同的项目中使用不同版本的pod而不冲突呢?

既然cocoapods是Ruby编写的,它本身就是一个gem包,那它肯定符合Ruby的包管理方案。

Ruby版本管理

我们使用rbenv来管理Mac中的Ruby版本。

在使用rbenv之前我们先查询一下前系统中的Ruby版本,一般Mac都会自带Ruby。

ruby --version

我们使用homebrew安装rbenv

brew install rbenv

然后使用命令 rbenv 即可查看是否安装成功

Untitled.png

安装完成后初始化一下rbenv,将下面的命令添加的PATH中。

eval "$(rbenv init -)" # 初始化rbenv

接下来,我们使用 rbenv来安装一个Ruby版本,查看可用的 Ruby版本。

rbenv install --list

然后安装其中一个版本

rbenv install 2.7.0

安装成功后我们查看一下当前系统中已安装的Ruby版本

rbenv versions

我们让刚刚下载的2.7.0版本在当前shell环境下生效

rbenv shell 2.7.0

Untitled 1.png

rbenv 中的 Ruby 版本有三个不同的作用域:全局(global),本地(local),当前终端(shell)。

查找版本的优先级是:当前终端 > 本地 > 全局。

  1. 设置全局版本

全局版本是在没有找到当前终端本地作用域的设置时执行。通过以下命令设置:

rbenv global 2.7.0
  1. 设置本地版本

本地作用域是在当前项目中生效,通过项目文件夹中的 .rbenv-version 这个文件进行管理,需要将相应的 Ruby 版本号写入这个文件。所以一般设置这个选项就可以了,这个过程可以通过以下命令执行:

rbenv local 2.7.0
  1. 设置当前终端版本

当前终端作用域的优先级最高。通过以下命令设置:

rbenv shell 2.7.0
  1. 使用系统Ruby

如果要使用系统原有的 Ruby,则通过 system 指定:

rbenv global system

设置完毕后可以通过以下命令进行验证:

which ruby  # ~/.rbenv/shims/ruby

rbenv version # 2.7.0 (set by RBENV_VERSION environment variable)

Ruby包管理工具

上述操作完成后,我们查看一下gem

which gem # ~/.rbenv/shims/gem

现在,gem已经变成了rbenv中的path了,我们使用gem list命令看一下当前环境下的cocoapods版本。

cocoapods (1.11.2)
cocoapods-core (1.11.2)
cocoapods-deintegrate (1.0.5)
cocoapods-downloader (1.5.1)
cocoapods-plugins (1.0.0)
cocoapods-search (1.0.1)
cocoapods-trunk (1.6.0)
cocoapods-try (1.2.0)

使用 Bundler 管理工程中的 Gem 环境

在这里我先创建了一个BundlerDemo的测试工程,目录如下:

Untitled 2.png

将当前目录下的ruby环境设置为2.7.0

rbenv local 2.7.0

查看gem列表中有没有bundler,如果没有,先安装一下bundler

gem install bundler

接下来就是初始化一下bundler的环境:

bundle init # Writing new Gemfile to ~/Codes.localized/BundlerDemo/Gemfile

然后我们目录中就多了一个Gemfile的文件,这个文件的作用和Podfile类似,只不过Gemfile是用来管理gem版本依赖的。

Untitled 3.png

初始化后的Gemfile文件中的内容长这样:

Untitled 4.png

接下来我们在文件中加入我们需要使用的cocoapods版本

gem "cocoapods", "1.10.1”

然后使用bundle install 来安装。完成后,我们项目的文件目录下会新增一个Gemfile.lock的文件,这个文件的作用和Podfile.lock的作用类似,用来锁定依赖结果的。

Untitled 5.png

这时,我们来查看一下当前Bundler环境下的gem列表:

bundle exec gem list

*** LOCAL GEMS ***

activesupport (5.2.8.1)
addressable (2.8.1)
algoliasearch (1.27.5)
atomos (0.1.3)
bundler (default: 2.1.2)
CFPropertyList (3.0.5)
claide (1.1.0)
cocoapods (1.10.1)
cocoapods-core (1.10.1)
cocoapods-deintegrate (1.0.5)
cocoapods-downloader (1.6.3)
cocoapods-plugins (1.0.0)
cocoapods-search (1.0.1)
cocoapods-trunk (1.6.0)
cocoapods-try (1.2.0)
...

使用当前Bundler来执行pod操作

接下来就是我们非常熟悉的操作了,我们先在项目目录下面创建一个Podfile文件,并在该文件中加入我们项目需要依赖的各种pod库。

Untitled 6.png

在这里我们就添加一个AFNetworking作为测试使用。

接下来就要执行pod install操作了,不过这里我们需要使用bundler中的cocoapods版本来执行install操作。

bundle exec pod install

输出结果和我们平时操作并没有什么不同:

Analyzing dependencies
Downloading dependencies
Installing AFNetworking (4.0.1)
Generating Pods project
Integrating client project

[!] Please close any current Xcode sessions and use `BundlerDemo.xcworkspace` for this project from now on.
Pod installation complete! There is 1 dependency from the Podfile and 1 total pod installed.

我们来查看Podfile.lock文件

Untitled 7.png

好了,我们已经使用Bundler中的cocoapods版本执行了install操作,后续我们如果要使用fastlane,也可以使用这种方式来管理版本。