我以前有一些这种形式的脚本:
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 上运行(在未执行 block 的情况下静默退出)。但它们仍然在我的开发环境 (Ubuntu) 中执行。
我使用脚本的相对路径运行它们(例如 rails runner scripts/thing.rb
)
rails 5.2
英雄联盟
__FILE__
:脚本的绝对路径(/app/scripts/thing.rb
)$0
:文件名(thing.rb
)
开发环境(ubuntu)
两者都只包含文件名。
rails 5.1
在这两种环境中,都只包含文件名。
最佳答案
我的团队在将我们的应用程序升级到 Rails 5.2 时也遇到了这个问题。我们不使用 Heroku,所以这通常是 Rails 而不是 Heroku 的问题。
当使用 rails runner
运行任何 Ruby 文件时,我们发现如果 ENV["RAILS_ENV"]
是 __FILE
将使用绝对路径设置为“测试”或“生产”,但如果设置为“开发”或未设置,则使用相对路径。有趣的是,如果使用 -e
标志设置环境,则 __FILE__
将始终使用相对路径。
我们发现将 bootsnap
作为依赖项移除可以解决我们的问题。这也意味着您必须从 config/boot.rb
中删除 require "bootsnap/setup"
行。
看起来 Rails 和 Bootsnap 如何同时读取环境变量并以某种方式覆盖 Ruby 设置 __FILE__
的方式可能存在错误。欢迎随时跟踪此问题:https://github.com/rails/rails/issues/36550
关于ruby-on-rails - 为什么 if __FILE__ == $0 在带有 Rails 5.2 的 Heroku 上不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56678683/