#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 переменных:
<%= Rails.env %>
что в итогеstaging
<%= ENV["RAILS_ENV"] %>
в итоге ничего не отображается<%= ENV["RACK_ENV"] %>
что в итогеdevelopment
Кроме того, если я запускаю консоль rails и набираю, Rails.env
также возвращается «разработка».
Я также использовал предложение в приведенном ниже ответе и запустил RAILS_ENV=development rails server
. При этом оба ENV["RAILS_ENV"]
и ENV["RACK_ENV"]
были настроены на разработку, но приложение все еще работало в промежуточном режиме (поэтому первая переменная выше не изменилась, а вторая изменилась).
Приложение все еще пытается использовать все установленные промежуточные переменные ENV (S3 и т. Д.). Для этого приложения я также недавно обновился с Rails 3. * до 4.2 (я знаю, что эти версии старые. Я унаследовал приложения и работаю над этим). Что стало причиной добавления промежуточной среды. Я не смог найти ничего в руководствах по обновлению, в которых говорилось бы об этой проблеме, поэтому сначала я не подозревал, что это связано, но я хотел дать как можно больше информации по этой проблеме.
Комментарии:
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!
Теперь он работает, как и ожидалось, На моем локальном компьютере.