我以前有一些这种形式的脚本:
class Thing
def do_things
...
end
end
if __FILE__ == $0
Thing.new.do_things
end
我用rails runner
调用了它们。他们在使用Rails 5.1的Heroku上运行良好。当我升级到Rails 5.2时,它们不再在Heroku上运行(由于不执行该块而静默退出)。但是它们仍然可以在我的开发环境(Ubuntu)中执行。
我使用脚本的相对路径(例如rails runner scripts/thing.rb
)运行它们
__FILE__
:脚本(/app/scripts/thing.rb
)的绝对路径$0
:文件名(thing.rb
)两者都只包含文件名。
在两种环境中,两者都只包含文件名。
答案 0 :(得分:2)
我的团队也在将我们的应用程序升级到Rails 5.2时遇到了这个问题。我们不使用Heroku,所以这通常是Rails而不是Heroku的问题。
使用rails runner
运行任何Ruby文件时,我们发现如果__FILE
设置为“ test”或“ production”,ENV["RAILS_ENV"]
将使用绝对路径,但使用相对路径如果设置为“开发”或未设置。有趣的是,如果改为使用-e
标志设置环境,则__FILE__
将始终使用相对路径。
我们发现删除bootsnap
作为依赖关系可以解决我们的问题。这也意味着您必须从require "bootsnap/setup"
中删除config/boot.rb
行。
关于Rails和Bootsnap如何读取环境变量以及以某种方式覆盖Ruby设置__FILE__
的方式似乎存在一个错误。随时跟踪此问题:https://github.com/rails/rails/issues/36550