ruby-on-rails - 为什么 if __FILE__ == $0 在带有 Rails 5.2 的 Heroku 上不起作用?

标签 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 上运行(在未执行 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/

相关文章:

python - 使用 Redis 添加重复任务

ruby-on-rails - Emacs 中的 Ruby 导航

ruby-on-rails - 验证 Rails 中的哈希列

ruby-on-rails - 为数组中对象的索引生成哈希查找表

ruby-on-rails - 任何人都可以解释这段 ruby​​ 代码中 '&' 的使用吗?

django - 将 JSON 文件内容加载到 Heroku 环境变量

ruby-on-rails - Rails 不使用 Heroku Redis 在后台发送电子邮件

javascript - 如何在 Angular.js 中为我的 Json 数据设置初始过滤器?

ruby-on-rails - ruby 数组映射双数组

ruby - REST API 测试 cucumber 步骤最佳实践