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 | minitest-5.27.0 requires ruby version >= 3.1, which is incompatible with the current |
1 | [!] Invalid `Podfile` file: Unable to activate onetool-1.8.12, because json-2.18.1 conflicts with json (= 2.7.2). |
二 查看gem版本
1 | gem list onetool |
可以看到各个版本onetool (1.8.12, 1.6.3, 1.5.1),说明全局的onetool版本很多。
三 问题原因
bundle exec的本质是建立一个隔离的沙盒,使用当前项目中的Gemfile。
除了Cocoapods的版本,还有Ruby工具库和插件,比如onetool。
Bundler可以锁定这些版本,避免互相不兼容。
比如不同APP,有不同的Gemfile
1 | source 'https://gems.ruby-china.com/' |
四 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 | # 1. 确保按照 Gemfile 安装了指定版本的依赖 |
原理: bundle exec 会强制 pod install 只使用 Gemfile 中声明的版本(即 onetool 1.6.3 和 cocoapods 1.12.0),从而完全屏蔽掉全局环境里那个捣乱的 1.8.12 版本。
生成的Gemfile.lock,是项目真正锁定的版本。
七 全局统一Gem
如果不同APP的配置都一样,或者只开发一款APP,那其实全局一个版本即可。手动把冲突的 onetool 卸载掉。
1 | gem uninstall onetool -v 1.8.12 |