Как приложение Rails устанавливает свое окружение (Dev., промежуточное и т. Д.)?

#ruby-on-rails #ruby-on-rails-4 #puma-dev

#ruby-on-rails #ruby-on-rails-4 #puma-dev

Вопрос:

Возникает очень запутанная проблема

Мое локальное приложение работает в его staging среде. Я использую puma-dev для сервера, и когда я запускаю tail -f ~/Library/Logs/puma-dev.log его, он сообщает, что среда находится в разработке, но когда я выхожу из своего представления, используя <%= Rails.env %> его, staging и приложение пытается использовать любые staging переменные среды, которые ему нужны, вместо переменных для development среды.

В приложении есть среды для Development , Staging , Test и Production . Только недавно я заметил, что это работает в staging, я не совсем уверен, как и когда оно переключилось, но последние пару лет оно работало в dev просто отлично, недавно я добавил промежуточную среду, чтобы помочь с обновлением rails, и в какой-то момент на прошлой неделе это начало выполнятьсяв промежуточной среде.

Я всегда думал, что это было установлено сервером при запуске, но puma-dev говорит, что его env — разработка. Я не понимаю, как это пытается работать в промежуточном режиме.

вывод puma-dev при запуске:

 io[19626]: Puma starting in single mode...
io[19626]: * Version 4.3.5 (ruby 2.4.6-p354), codename: Mysterious Traveller
io[19626]: * Min threads: 0, max threads: 5
io[19626]: * Environment: development
  

Может ли кто-нибудь пролить свет на то, где и как приложение Rails решает установить свою среду, потому что, хоть убей, я не могу найти ее в приложении.

В качестве теста, основанного на приведенном ниже ответе (который был полезен) Я выхожу из этих 3 переменных:

  1. <%= Rails.env %> что в итоге staging
  2. <%= ENV["RAILS_ENV"] %> в итоге ничего не отображается
  3. <%= ENV["RACK_ENV"] %> что в итоге development

Кроме того, если я запускаю консоль rails и набираю, Rails.env также возвращается «разработка».

Я также использовал предложение в приведенном ниже ответе и запустил RAILS_ENV=development rails server . При этом оба ENV["RAILS_ENV"] и ENV["RACK_ENV"] были настроены на разработку, но приложение все еще работало в промежуточном режиме (поэтому первая переменная выше не изменилась, а вторая изменилась).

Приложение все еще пытается использовать все установленные промежуточные переменные ENV (S3 и т. Д.). Для этого приложения я также недавно обновился с Rails 3. * до 4.2 (я знаю, что эти версии старые. Я унаследовал приложения и работаю над этим). Что стало причиной добавления промежуточной среды. Я не смог найти ничего в руководствах по обновлению, в которых говорилось бы об этой проблеме, поэтому сначала я не подозревал, что это связано, но я хотел дать как можно больше информации по этой проблеме.

Комментарии:

1. guides.rubyonrails.org/…

2. @tar ya man Я уже создал промежуточную среду. это совсем не то, о чем мой вопрос.

3. @RockwellRice с помощью которого вы запускаете сервер rails server -e staging ? Судя по вашему вопросу, комментарий @tar — это именно то, что вам нужно. Включение большего количества кода в ваш ответ поможет нам не предполагать, что вы чего-то не сделали.

4. @Chiperific Я нет, сервер puma-dev, и, как я ЧЕТКО упомянул в своем вопросе, он говорит, что он работает в режиме разработки, поэтому я так застрял с этим. Я более чем рад включить любой связанный код, который мог бы помочь, но я не уверен, что это может быть, какой код вы хотели бы, чтобы я добавил в помощь? Я добавил вывод из puma-dev и команды, которые я использую для отображения env, что-нибудь еще, просто дайте мне знать, и я добавлю это.

5. Учитывая ваше обновление, что-то в инициализаторе настраивает ваш локальный env на staging , исправление, которое может устранить вашу головную боль. Я предполагаю, что когда вы добавляли свою промежуточную среду, вы добавили фрагмент кода, который всегда настраивает вас на промежуточную.

Ответ №1:

Чтобы убедиться, что мне все ясно:

  • ваше локальное приложение является «промежуточным»
  • вы хотите, чтобы ваше локальное приложение запускалось в режиме «разработка»
  • вы видите, что puma работает в режиме «разработка», но приложение, похоже, извлекает переменные для «промежуточного»
  • вы хотите, чтобы puma работала в режиме «разработка», а приложение распознавало, что оно находится в «разработке»

Puma настраивает свою среду следующим образом:

 :environment => -> { ENV['RACK_ENV'] || "development" }
  

Rails устанавливает .env так:

 # File railties/lib/rails.rb, line 73
def env
  @_env ||= ActiveSupport::StringInquirer.new(ENV["RAILS_ENV"].presence || ENV["RACK_ENV"].presence || "development")
end
  

Итак, если есть, но есть, то они будут не совпадать. RACK_ENV development RAILS_ENV staging

Попробуйте:

 RAILS_ENV=development rails server
  

Или проверьте значения ENV["RAILS_ENV"] и ENV["RACK_ENV"] во время работы сервера.

Комментарии:

1. Спасибо за это. Итак, учитывая ваше руководство здесь, я заметил, что ENV["RAILS_ENV"] это ничего не возвращает, а ENV["RACK_ENV"] возвращает разработку. Так что, должно быть, что-то сломало первое. Я рассмотрю это. Еще раз спасибо за это объяснение, надеюсь, я смогу использовать эту тему.

2. Да, я предполагаю, что что-то, что вы изменили при добавлении staging env, на самом деле отключено (или не установлено) ENV["RAILS_ENV"] , выяснение этого может решить обе ваши проблемы.

Ответ №2:

Наконец-то понял это сегодня.

После добавления промежуточной среды в приложение, я думаю, мне нужно было добавить некоторые конфигурационные файлы внутри puma каталога в самом приложении, чтобы помочь puma выяснить, что ему нужно делать.

Честно говоря, я до сих пор не уверен, зачем мне это нужно, поскольку puma сказал бы, что он работает в процессе разработки, а я думал, что это настройка среды.

Что я сделал, так это добавил puma каталог внутри config каталога, а затем добавил файл с именем development.rb и поместил туда настройку для запуска в среде разработки.

Содержимое puma /development.rb:

 #!/usr/bin/env puma
root = "/Path/to/the/application"
daemonize false
environment "development"
directory root
pidfile "#{root}/tmp/pids/puma.pid"
stdout_redirect "#{root}/log/puma_stdout.log", "#{root}/log/puma_stderr.log", true
workers 2
threads 8,32
bind "unix:///#{root}/tmp/sockets/puma.sock"
bind "tcp://0.0.0.0:8080"
preload_app! 
  

Теперь он работает, как и ожидалось, На моем локальном компьютере.