在脚本中通过require_relative加载环境时,环境的代码会再次执行
真奇怪,我在做一个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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。