Shim для загрузки переменных среды из .env
в ENV
в стадии разработки .
Хранение конфигурации в среде — один из принципов двенадцатифакторного приложения. Все, что может меняться в разных средах развертывания, например дескрипторы ресурсов для баз данных или учетные данные для внешних служб, должно быть извлечено из кода в переменные среды.
Но не всегда практично устанавливать переменные среды на машинах разработки или серверах непрерывной интеграции, где выполняется несколько проектов. dotenv загружает переменные из файла .env
в ENV
при загрузке среды.
Добавьте эту строку в начало Gemfile вашего приложения и запустите bundle install
:
gem 'dotenv' , groups : [ :development , :test ]
Добавьте конфигурацию вашего приложения в файл .env
в корне вашего проекта:
S3_BUCKET=YOURS3BUCKET
SECRET_KEY=YOURSECRETKEYGOESHERE
Всякий раз, когда ваше приложение загружается, эти переменные будут доступны в ENV
:
config . fog_directory = ENV [ 'S3_BUCKET' ]
Дополнительную информацию см. в документации API.
Dotenv будет автоматически загружаться при загрузке вашего приложения Rails. См. Настройка Rails, чтобы изменить, какие файлы и когда загружаются.
Загрузите Dotenv как можно раньше в процессе загрузки приложения:
require 'dotenv/load'
# or
require 'dotenv'
Dotenv . load
По умолчанию load
будет искать файл с именем .env
в текущем рабочем каталоге. Передайте несколько файлов, и они будут загружены по порядку. Победит первое значение, установленное для переменной.
require 'dotenv'
Dotenv . load ( 'file1.env' , 'file2.env' )
Начиная с версии 3.0, dotenv в приложении Rails автоматически восстанавливает ENV
после каждого теста. Это означает, что вы можете изменять ENV
в своих тестах, не опасаясь утечки состояния в другие тесты. Он работает как с ActiveSupport::TestCase
, так и с Rspec
.
Чтобы отключить это поведение, установите config.dotenv.autorestore = false
в config/application.rb
или config/environments/test.rb
. По умолчанию он отключен, если ваше приложение использует Climate_control или Ice_age.
Чтобы использовать это поведение вне приложения Rails, просто require "dotenv/autorestore"
в свой набор тестов.
См. Dotenv.save
, Dotenv.restore и Dotenv.modify(hash) { ... }
для использования вручную.
Чтобы убедиться, что .env
загружен в rake, загрузите задачи:
require 'dotenv/tasks'
task mytask : :dotenv do
# things that require .env
end
Вы можете использовать исполняемый файл dotenv
load .env
перед запуском приложения:
$ dotenv ./script.rb
Исполняемый файл dotenv
также принимает флаг -f
. Его значение должно представлять собой список файлов конфигурации, разделенных запятыми, в порядке от наиболее важных к наименее. Все файлы должны существовать. Между флагом и его значением должен быть пробел.
$ dotenv -f " .env.local,.env " ./script.rb
Исполняемый файл dotenv
может игнорировать отсутствующие файлы с помощью флага -i
или --ignore
. Например, если файл .env.local
не существует, следующая команда будет игнорировать отсутствующий файл и загружать только файл .env
.
$ dotenv -i -f " .env.local,.env " ./script.rb
Если вы используете драгоценные камни, которые требуют установки переменных среды перед их загрузкой, укажите dotenv
в Gemfile
перед этими другими драгоценными камнями и требуйте dotenv/load
.
gem 'dotenv' , require : 'dotenv/load'
gem 'gem-that-requires-env-variables'
Dotenv загрузит следующие файлы в зависимости от RAILS_ENV
, причем первый файл будет иметь самый высокий приоритет, а .env
— самый низкий приоритет:
Приоритет | Среда | .gitignore это? | Примечания | ||
---|---|---|---|---|---|
разработка | тест | производство | |||
самый высокий | .env.development.local | .env.test.local | .env.production.local | Да | Локальные переопределения, зависящие от среды |
2-й | .env.local | Н/Д | .env.local | Да | Локальные переопределения |
3-й | .env.development | .env.test | .env.production | Нет | Общие переменные, специфичные для среды |
последний | .env | .env | .env | Может быть | Общий для всех сред |
Эти файлы загружаются во время обратного вызова before_configuration
, который запускается, когда константа Application
определена в config/application.rb
с class Application < Rails::Application
. Если вам нужно, чтобы его инициализировали раньше или вам нужно настроить процесс загрузки, вы можете сделать это в верхней части файла application.rb
# config/application.rb
Bundler . require ( * Rails . groups )
# Load .env.local in test
Dotenv :: Rails . files . unshift ( ".env.local" ) if ENV [ "RAILS_ENV" ] == "test"
module YourApp
class Application < Rails :: Application
# ...
end
end
Доступные варианты:
Dotenv::Rails.files
— список файлов для загрузки в порядке приоритета.Dotenv::Rails.overwrite
— перезаписать существующие переменные ENV
содержимым файлов .env*
.Dotenv::Rails.logger
— регистратор, используемый для ведения журналов dotenv. По умолчанию Rails.logger
Dotenv::Rails.autorestore
- Включить или отключить автовосстановлениеМногострочные значения с разрывами строк должны быть заключены в двойные кавычки.
PRIVATE_KEY= " -----BEGIN RSA PRIVATE KEY-----
...
HkVN9...
...
-----END DSA PRIVATE KEY----- "
До версии 3.0 dotenv заменял n
в строках в кавычках на новую строку, но такое поведение устарело. Чтобы использовать старое поведение, установите DOTENV_LINEBREAK_MODE=legacy
перед любыми переменными, которые включают n
:
DOTENV_LINEBREAK_MODE=legacy
PRIVATE_KEY= " -----BEGIN RSA PRIVATE KEY-----nHkVN9...n-----END DSA PRIVATE KEY-----n "
Вам нужно добавить вывод команды в одну из переменных? Просто добавьте его с помощью $(your_command)
:
DATABASE_URL= " postgres:// $( whoami ) @localhost/my_database "
Вам нужно добавить значение другой переменной в одну из ваших переменных? Вы можете ссылаться на переменную с помощью ${VAR}
или часто просто $VAR
в значениях без кавычек или в двойных кавычках.
DATABASE_URL= " postgres:// ${USER} @localhost/my_database "
Если значение содержит знак $
и оно не предназначено для использования в качестве переменной, заключите его в одинарные кавычки.
PASSWORD= ' pas$word '
Комментарии могут быть добавлены к вашему файлу следующим образом:
# This is a comment
SECRET_KEY=YOURSECRETKEYGOESHERE # comment
SECRET_HASH= " something-with-a-#-hash "
Для совместимости вы также можете добавить export
перед каждой строкой, чтобы вы могли source
файл в bash:
export S3_BUCKET=YOURS3BUCKET
export SECRET_KEY=YOURSECRETKEYGOESHERE
Если определенное значение конфигурации требуется, но не установлено, уместно вызвать ошибку.
Чтобы запросить ключи конфигурации:
# config/initializers/dotenv.rb
Dotenv . require_keys ( "SERVICE_APP_ID" , "SERVICE_KEY" , "SERVICE_SECRET" )
Если какой-либо из указанных выше конфигурационных ключей не установлен, ваше приложение выдаст ошибку во время инициализации. Этот метод предпочтителен, поскольку он предотвращает ошибки во время выполнения рабочего приложения из-за неправильной конфигурации.
Чтобы проанализировать список файлов env для программной проверки без изменения ENV:
Dotenv . parse ( ".env.local" , ".env" )
# => {'S3_BUCKET' => 'YOURS3BUCKET', 'SECRET_KEY' => 'YOURSECRETKEYGOESHERE', ...}
Этот метод возвращает хеш пар имя/значение переменной ENV.
Вы можете использовать флаг -t
или --template
в командной строке dotenv, чтобы создать шаблон вашего файла .env
.
$ dotenv -t .env
В вашем рабочем каталоге будет создан шаблон с именем {FILENAME}.template
. Итак, в приведенном выше примере будет создан файл .env.template
.
Шаблон будет содержать все переменные среды в вашем файле .env
, но их значениям будут присвоены имена переменных.
# .env
S3_BUCKET=YOURS3BUCKET
SECRET_KEY=YOURSECRETKEYGOESHERE
Стал бы
# .env.template
S3_BUCKET=S3_BUCKET
SECRET_KEY=SECRET_KEY
dotenv изначально создавался для загрузки переменных конфигурации в ENV
находящийся в стадии разработки . Обычно существуют более эффективные способы управления конфигурацией в производственных средах, например /etc/environment
управляемый Puppet или Chef, heroku config
и т. д.
Однако некоторые считают dotenv удобным способом настройки приложений Rails в промежуточной и производственной средах, и вы можете сделать это, определив файлы, специфичные для среды, такие как .env.production
или .env.test
.
Если вы используете этот драгоценный камень для обработки переменных env для нескольких сред Rails (разработка, тестирование, производство и т. д.), обратите внимание, что переменные env, общие для всех сред, должны храниться в .env
. Затем переменные окружения, специфичные для среды, должны быть сохранены в .env.
.
Учетные данные должны быть доступны только на тех компьютерах, которым необходим доступ к ним. Никогда не помещайте конфиденциальную информацию в репозиторий, который не нужен каждой машине и серверу разработки.
Лично я предпочитаю сохранять файл .env
с настройками только для разработки. Это позволяет другим разработчикам легко приступить к работе над проектом, не ставя под угрозу учетные данные для других сред. Если вы последуете этому совету, убедитесь, что все учетные данные для вашей среды разработки отличаются от других ваших развертываний и что учетные данные разработки не имеют доступа к каким-либо конфиденциальным данным.
ENV
? По умолчанию существующие переменные среды не перезаписываются, поскольку dotenv предполагает, что среда развертывания имеет больше знаний о конфигурации, чем приложение. Чтобы перезаписать существующие переменные среды, вы можете использовать Dotenv.load files, overwrite: true
.
Вы также можете использовать флаг -o
или --overwrite
в командной строке dotenv, чтобы перезаписать существующие переменные ENV
.
$ dotenv -o -f " .env.local,.env "
Если вы хотите получить лучшее представление о том, как работает dotenv, ознакомьтесь с разделом «Чтение кода dotenv Ruby Rogues».
git checkout -b my-new-feature
)git commit -am 'Added some feature'
)git push origin my-new-feature
)