在脚本中通过require_relative加载环境时,环境的代码会再次执行

编程语言 2026-07-10

真奇怪,我在做一个Rails 8项目,还有一个脚本 bin/odd

#!/usr/bin/env ruby

puts 'quack'
require_relative '../config/environment'
puts 'done'

在生产环境中,RAILS_ENV=production bin/odd 报告

quack
quack
done

在开发环境中,bin/odd 报告了我所期望的结果

quack
done

有谁知道这是为什么吗?

解决方案

在调试器里花了几个小时后,我认为这是按预期的行为。重启是由Bundler执行的,具体来说,SelfManager#restart_with_locked_bundler_if_needed,它是从 .autoswitch 中的 setup.rb 调用的。

看看 bin 里的其他脚本,很多都以require "bundler/setup" 开头,这就说得通了:一开始就让重启使用正确版本的Bundler解决掉,然后考虑到它在某种程度上的缓存,接着加载Rails环境就不需要了。

特别地,修改后的最小脚本

#!/usr/bin/env ruby

require 'rubygems'
require 'bundler/setup'

puts 'quack'
require_relative '../config/environment'
puts 'done'

输出

quack
done

正如人们所期望的那样。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章