Загрузка переменной среды в загрузочный файл

#ruby-on-rails #ruby #ruby-on-rails-5.2

#ruby-on-rails #ruby #ruby-on-rails-5.2

Вопрос:

Я столкнулся с проблемой при загрузке переменной среды в boot.rb. Я пробовал использовать 2 драгоценных камня dotenv и dotenv-rails, но ни один из них не сработал для меня. В других местах я могу использовать переменную среды, но не в boot.rb. У кого-нибудь есть какие-либо подсказки по этому вопросу

 if ["development"].include?(ENV['RAILS_ENV'])
   require 'bootsnap/setup'
   
   Bootsnap.setup(
    cache_dir:            'tmp/cache',          # Path to your cache
    development_mode:     'development', # Current working environment, e.g. RACK_ENV, RAILS_ENV, etc
    load_path_cache:      true,                 # Optimize the LOAD_PATH with a cache
    autoload_paths_cache: true,                 # Optimize ActiveSupport autoloads with cache
    compile_cache_iseq:   true,                 # Compile Ruby code into ISeq cache, breaks coverage reporting.
    compile_cache_yaml:   true                  # Compile YAML into a cache
  )
end
  

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

1. Вы не сказали, что это за содержимое RAILS_ENV , но поскольку ваш массив содержит только один элемент ( "development" ) , вы можете переписать свое условие на if ENV['RAILS_ENV'] == "development" . Это то же самое, что и ваш текущий код, но его легче понять.

2. RAILS_ENV=development задается в файле .env

3. Возможно, но до какого значения? Кроме того, вы уверены, что .env файл был обработан при выполнении этого кода? Я предлагаю распечатать это значение для отладки.

4. Я пытаюсь отладить значение ENV[‘RAILS_ENV’], оно дает ноль. Но когда я проверяю в консоли rails или где-либо в приложении, он выдает мне правильное значение. Я подозреваю, что во время загрузки файл .env не загружается

5. Тогда я проголосовал за закрытие вопроса.

Ответ №1:

DotEnv загрузит ваш .env файл в env только после загрузки Gem.

В Rails это делается с помощью строки Bundler.require(*Rails.groups) in config/application.rb . Если вам нужно получить доступ к переменным env до этого, вам нужно вручную вызвать Dotenv::Railtie.load :

 Bundler.require(*Rails.groups)
Dotenv::Railtie.load
  

Или, по крайней мере, это то, что readme заставит вас поверить. Я думаю, вместо Railtie вы могли бы использовать простой подход ruby:

 require 'dotenv'
Dotenv.load 
  

Но есть множество вариантов установки переменных ENV из файла, такого как direnv, который не является драгоценным камнем Ruby и подключается к самой вашей оболочке.

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

1. Спасибо, это не сработало так, но это дало мне подсказку. Когда я добавил Dotenv::Railtie. загрузка в application.rb это был частный метод `load’, вызванный для Dotenv::Railtie:Class. Затем я снова попробовал ту же строку в boot.rb, но это все равно не сработало. Позже то, что я попробовал с этими двумя строками в boot.rb, и это сработало, требует ‘dotenv’ Dotenv.load

2. Я предполагаю, что документы тогда сломаны. Я не использовал dotenv годами. direnv выполняет эту работу и позволяет избежать загромождения вашего gemfile тем, что на самом деле является специфичным для машины инструментом.

Ответ №2:

Вы можете использовать — в зависимости от ваших потребностей — load или require для явной обработки вашего .env файла перед тестированием переменной среды.