Почему, если __FILE__ == $ 0 не работает на Heroku с Rails 5.2? - PullRequest
4 голосов
/ 20 июня 2019

У меня ранее было несколько скриптов этой формы:

class Thing
  def do_things
    ...
  end
end

if __FILE__ == $0
  Thing.new.do_things
end

Я вызвал их с rails runner. Они хорошо работали на Heroku с Rails 5.1. Когда я обновился до rails 5.2, они больше не бегали на Heroku (молча выходя из блока, который не был выполнен). Но они все еще выполняются в моей среде разработки (Ubuntu).

Я запускаю их, используя относительный путь к сценарию (например, rails runner scripts/thing.rb)

Рельсы 5.2

Heroku

  • __FILE__: абсолютный путь к сценарию (/app/scripts/thing.rb)
  • $0: имя файла (thing.rb)

Среда разработки (Ubuntu)

Оба содержат только имя файла.

Рельсы 5.1

В обеих средах оба содержат только имя файла.

1 Ответ

2 голосов
/ 24 июня 2019

Моя команда столкнулась с этой проблемой при обновлении нашего приложения до Rails 5.2.Мы не используем Heroku, поэтому это проблема с Rails в целом вместо Heroku.

При запуске любого файла Ruby с rails runner мы обнаружили, что __FILE будет использовать абсолютный путь, если ENV["RAILS_ENV"] было установлено "test" или "production", но использовать относительный путь, если установлено "development" или не задано.Интересно, что если бы вместо среды был установлен флаг -e, то __FILE__ всегда использовал бы относительный путь.

Мы обнаружили, что удаление bootsnap в качестве зависимости решило проблему для нас.Это также означает, что вам придется удалить строку require "bootsnap/setup" из config/boot.rb.

Похоже, что может быть ошибка, связанная с тем, что Rails и Bootsnap одновременно читают переменные среды и каким-то образом перезаписывают то, как устанавливает Ruby__FILE__.Не стесняйтесь отслеживать эту проблему: https://github.com/rails/rails/issues/36550

...