KangQingYu
Articles57
Tags21
Categories9
gem依赖多项目版本不一致,用 bundle exec + Gemfile 做项目级隔离

gem依赖多项目版本不一致,用 bundle exec + Gemfile 做项目级隔离

司机,乘客,外卖,金融,每个业务方都有自己的独立APP,每个还分巴西,墨西哥。当涉及的业务多了,APP多了,每个业务环境都不一样,就出现问题了。

以前项目比较简单的时候,pod install即可。但是当涉及到业务线比较多,不同APP有不同的版本依赖的时候,再用pod install就会有各种奇怪的报错,因为pod install使用的是全局安装的版本。

一 xcode工程配置各种报错

1
[!] Failed to download 'BoringSSL': wrong number of arguments (given 2, expected 1)
1
2
3
4
 minitest-5.27.0 requires ruby version >= 3.1, which is incompatible with the current
version, ruby 2.7.4p191

bundler: failed to load command: pod (/Users/kqy/.rbenv/versions/2.7.4/bin/pod)
1
[!] Invalid `Podfile` file: Unable to activate onetool-1.8.12, because json-2.18.1 conflicts with json (= 2.7.2).

二 查看gem版本

1
2
3
gem list onetool

onetool (1.8.12, 1.6.3, 1.5.1)

可以看到各个版本onetool (1.8.12, 1.6.3, 1.5.1),说明全局的onetool版本很多。

三 问题原因

bundle exec的本质是建立一个隔离的沙盒,使用当前项目中的Gemfile。
除了Cocoapods的版本,还有Ruby工具库和插件,比如onetool。
Bundler可以锁定这些版本,避免互相不兼容。

比如不同APP,有不同的Gemfile

1
2
3
4
5
6
7
8
9
10
source 'https://gems.ruby-china.com/'
source 'http://artifactory.companyname.com/artifactory/api/gems/rubygems/'

gem 'onetool', "1.6.3", source: 'http://apparch.companyname.com/'
gem 'cocoapods', "1.12.0"
gem 'activesupport', '>= 6.1.7.3', '< 7.1.0'
gem 'plist', "3.7.0"
gem 'minitest', '~> 5.15.0'
gem 'ffi', '~> 1.15.5'

四 Rbenv安装

rbenv是多版本环境管理器。
列出可安装的版本
rbenv install --list
安装制定版本
rbenv install 2.7.4

切换全局版本
rbenv global 2.7.4
切换项目版本
rbenv local 3.1.2

查看本地ruby有哪些版本
rbenv versions

五 Ruby与Gem关系

Gem(RubyGems)是包管理器与软件包,类似苹果的AppStore。
而具体的一个gem,是写好的一段Ruby代码包,类似AppStore中的App。

CocoaPods就是一个Gem。
被CocoaPods借用的底层工具包,就是依赖的Gem。比如activesupport、ffi。

六 标准用法

1
2
3
4
5
# 1. 确保按照 Gemfile 安装了指定版本的依赖
bundle install

# 2. 加上 bundle exec 前缀来执行 pod install
bundle exec pod install

原理: bundle exec 会强制 pod install 只使用 Gemfile 中声明的版本(即 onetool 1.6.3cocoapods 1.12.0),从而完全屏蔽掉全局环境里那个捣乱的 1.8.12 版本。

生成的Gemfile.lock,是项目真正锁定的版本。

七 全局统一Gem

如果不同APP的配置都一样,或者只开发一款APP,那其实全局一个版本即可。手动把冲突的 onetool 卸载掉。

1
gem uninstall onetool -v 1.8.12
Author:KangQingYu
Link:http://example.com/2023/05/13/20230513gem%E4%BE%9D%E8%B5%96%E5%A4%9A%E9%A1%B9%E7%9B%AE%E7%89%88%E6%9C%AC%E4%B8%8D%E4%B8%80%E8%87%B4%EF%BC%8C%E7%94%A8%20bundle%20exec%20+%20Gemfile%20%E5%81%9A%E9%A1%B9%E7%9B%AE%E7%BA%A7%E9%9A%94%E7%A6%BB/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可
×