如何避免Gemfile.lock中出现特定平台的Gems?
问题原因
这是因为新版本的Bundler(2.3.26)和Rubygems(3.4.10)调整了默认行为:
- 它们会优先选用适配你本地arm64 macOS环境的预编译gem包,而非通用的跨平台版本。sqlite3 1.7.0开始推出了针对arm64-darwin的专属二进制包,所以Gemfile.lock里就记录了这个平台专属版本,替代了之前的通用版
sqlite3 (1.6.9)。 - 同时,Bundler现在会把当前运行的具体操作系统平台(
arm64-darwin-22/arm64-darwin-23)写入lock文件,代替之前通用的ruby标识,这就导致lock文件和你的本地平台绑定,失去了跨平台通用性。
保持Gemfile.lock平台无关性的方法
给你几个实用方案:
强制生成跨平台lock文件
更新或安装依赖时,通过参数指定只锁定通用ruby平台的版本:# 更新依赖并生成跨平台lock文件 bundle update --no-install --platform ruby # 首次安装依赖生成lock文件时用 bundle install --no-install --platform ruby加
--no-install是为了避免在本地安装平台专属gem,只更新lock文件内容。设置全局默认配置
一次配置让Bundler默认只处理跨平台版本,不用每次加参数:bundle config set --global platform ruby之后再执行
bundle install或bundle update,都会自动生成平台无关的lock文件。手动修正现有lock文件
要是不想重新生成,直接编辑Gemfile.lock也可以:- 将sqlite3的版本行改回
sqlite3 (1.7.0),去掉-arm64-darwin后缀 - 删除平台部分的
arm64-darwin-22和arm64-darwin-23,换回ruby
改完后执行bundle check验证,确保依赖没有冲突。
- 将sqlite3的版本行改回
内容的提问来源于stack exchange,提问作者Jesper Røn-Jensen
相关产品推荐
相关产品推荐

