如果__FILE__ == $ 0在带有Rails 5.2的Heroku中不起作用怎么办?

时间:2019-06-20 03:46:07

标签: ruby-on-rails ruby heroku ruby-on-rails-5.2

我以前有一些这种形式的脚本:

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)运行它们

Rails 5.2

Heroku

  • __FILE__:脚本(/app/scripts/thing.rb)的绝对路径
  • $0:文件名(thing.rb

开发环境(ubuntu)

两者都只包含文件名。

Rails 5.1

在两种环境中,两者都只包含文件名。

1 个答案:

答案 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