Calce para cargar variables de entorno desde .env
a ENV
en desarrollo .
Almacenar la configuración en el entorno es uno de los principios de una aplicación de doce factores. Cualquier cosa que pueda cambiar entre entornos de implementación, como identificadores de recursos para bases de datos o credenciales para servicios externos, debe extraerse del código en variables de entorno.
Pero no siempre es práctico establecer variables de entorno en máquinas de desarrollo o servidores de integración continua donde se ejecutan múltiples proyectos. dotenv carga variables de un archivo .env
en ENV
cuando se inicia el entorno.
Agregue esta línea en la parte superior del Gemfile de su aplicación y ejecute bundle install
:
gem 'dotenv' , groups : [ :development , :test ]
Agregue la configuración de su aplicación a su archivo .env
en la raíz de su proyecto:
S3_BUCKET=YOURS3BUCKET
SECRET_KEY=YOURSECRETKEYGOESHERE
Siempre que se cargue su aplicación, estas variables estarán disponibles en ENV
:
config . fog_directory = ENV [ 'S3_BUCKET' ]
Consulte los documentos API para obtener más información.
Dotenv se cargará automáticamente cuando se inicie la aplicación Rails. Consulte Personalización de Rails para cambiar qué archivos se cargan y cuándo.
Cargue Dotenv lo antes posible en el proceso de arranque de su aplicación:
require 'dotenv/load'
# or
require 'dotenv'
Dotenv . load
De forma predeterminada, load
buscará un archivo llamado .env
en el directorio de trabajo actual. Pase varios archivos y se cargarán en orden. El primer valor establecido para una variable ganará.
require 'dotenv'
Dotenv . load ( 'file1.env' , 'file2.env' )
Desde 3.0, dotenv en una aplicación Rails restaurará automáticamente ENV
después de cada prueba. Esto significa que puede modificar ENV
en sus pruebas sin temor a filtrar el estado a otras pruebas. Funciona tanto con ActiveSupport::TestCase
como con Rspec
.
Para deshabilitar este comportamiento, configure config.dotenv.autorestore = false
en config/application.rb
o config/environments/test.rb
. Está deshabilitado de forma predeterminada si su aplicación usa Climate_control o ice_age.
Para usar este comportamiento fuera de una aplicación Rails, solo require "dotenv/autorestore"
en su conjunto de pruebas.
Consulte Dotenv.save
, Dotenv.restore y Dotenv.modify(hash) { ... }
para conocer el uso manual.
Para asegurarse de que .env
esté cargado en rake, cargue las tareas:
require 'dotenv/tasks'
task mytask : :dotenv do
# things that require .env
end
Puede utilizar el ejecutable dotenv
para cargar .env
antes de iniciar su aplicación:
$ dotenv ./script.rb
El ejecutable dotenv
también acepta el indicador -f
. Su valor debe ser una lista de archivos de configuración separados por comas, en orden de más importante a menos. Todos los archivos deben existir. Debe haber un espacio entre la bandera y su valor.
$ dotenv -f " .env.local,.env " ./script.rb
El ejecutable dotenv
puede opcionalmente ignorar los archivos faltantes con el indicador -i
o --ignore
. Por ejemplo, si el archivo .env.local
no existe, lo siguiente ignorará el archivo que falta y solo cargará el archivo .env
.
$ dotenv -i -f " .env.local,.env " ./script.rb
Si usa gemas que requieren que se establezcan variables de entorno antes de cargarlas, incluya dotenv
en el Gemfile
antes de esas otras gemas y requiera dotenv/load
.
gem 'dotenv' , require : 'dotenv/load'
gem 'gem-that-requires-env-variables'
Dotenv cargará los siguientes archivos dependiendo de RAILS_ENV
, donde el primer archivo tendrá la prioridad más alta y .env
tendrá la prioridad más baja:
Prioridad | Ambiente | .gitignore ? | Notas | ||
---|---|---|---|---|---|
desarrollo | prueba | producción | |||
más alto | .env.development.local | .env.test.local | .env.production.local | Sí | Anulaciones locales específicas del entorno |
2do | .env.local | N / A | .env.local | Sí | Anulaciones locales |
3er | .env.development | .env.test | .env.production | No | Variables compartidas específicas del entorno |
último | .env | .env | .env | Tal vez | Compartido para todos los entornos. |
Estos archivos se cargan durante la devolución de llamada before_configuration
, que se activa cuando la constante Application
se define en config/application.rb
con class Application < Rails::Application
. Si necesita que se inicialice antes o necesita personalizar el proceso de carga, puede hacerlo en la parte superior de 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
Opciones disponibles:
Dotenv::Rails.files
: lista de archivos que se cargarán, en orden de prioridad.Dotenv::Rails.overwrite
- Sobrescribe las variables ENV
existentes con el contenido de archivos .env*
Dotenv::Rails.logger
: el registrador que se utilizará para el registro de dotenv. El valor predeterminado es Rails.logger
Dotenv::Rails.autorestore
- Activa o desactiva la restauración automáticaLos valores de varias líneas con saltos de línea deben estar entre comillas dobles.
PRIVATE_KEY= " -----BEGIN RSA PRIVATE KEY-----
...
HkVN9...
...
-----END DSA PRIVATE KEY----- "
Antes de 3.0, dotenv reemplazaba n
en cadenas entre comillas con una nueva línea, pero ese comportamiento está en desuso. Para utilizar el comportamiento anterior, establezca DOTENV_LINEBREAK_MODE=legacy
antes de cualquier variable que incluya n
:
DOTENV_LINEBREAK_MODE=legacy
PRIVATE_KEY= " -----BEGIN RSA PRIVATE KEY-----nHkVN9...n-----END DSA PRIVATE KEY-----n "
¿Necesita agregar la salida de un comando en una de sus variables? Simplemente agréguelo con $(your_command)
:
DATABASE_URL= " postgres:// $( whoami ) @localhost/my_database "
¿Necesitas agregar el valor de otra variable en una de tus variables? Puede hacer referencia a la variable con ${VAR}
o, a menudo, solo $VAR
en valores sin comillas o con comillas dobles.
DATABASE_URL= " postgres:// ${USER} @localhost/my_database "
Si un valor contiene $
y no pretende ser una variable, envuélvalo entre comillas simples.
PASSWORD= ' pas$word '
Se pueden agregar comentarios a su archivo como tales:
# This is a comment
SECRET_KEY=YOURSECRETKEYGOESHERE # comment
SECRET_HASH= " something-with-a-#-hash "
Por compatibilidad, también puede agregar export
delante de cada línea para poder source
el archivo en bash:
export S3_BUCKET=YOURS3BUCKET
export SECRET_KEY=YOURSECRETKEYGOESHERE
Si se requiere un valor de configuración particular pero no se establece, es apropiado generar un error.
Para requerir claves de configuración:
# config/initializers/dotenv.rb
Dotenv . require_keys ( "SERVICE_APP_ID" , "SERVICE_KEY" , "SERVICE_SECRET" )
Si alguna de las claves de configuración anteriores no está configurada, su aplicación generará un error durante la inicialización. Se prefiere este método porque evita errores de tiempo de ejecución en una aplicación de producción debido a una configuración incorrecta.
Para analizar una lista de archivos env para inspección programática sin modificar ENV:
Dotenv . parse ( ".env.local" , ".env" )
# => {'S3_BUCKET' => 'YOURS3BUCKET', 'SECRET_KEY' => 'YOURSECRETKEYGOESHERE', ...}
Este método devuelve un hash de los pares de nombre/valor de ENV var.
Puede usar el indicador -t
o --template
en dotenv cli para crear una plantilla de su archivo .env
.
$ dotenv -t .env
Se creará una plantilla en su directorio de trabajo llamada {FILENAME}.template
. Entonces, en el ejemplo anterior, crearía un archivo .env.template
.
La plantilla contendrá todas las variables de entorno en su archivo .env
pero con sus valores establecidos en los nombres de las variables.
# .env
S3_BUCKET=YOURS3BUCKET
SECRET_KEY=YOURSECRETKEYGOESHERE
se convertiría
# .env.template
S3_BUCKET=S3_BUCKET
SECRET_KEY=SECRET_KEY
dotenv se creó originalmente para cargar variables de configuración en ENV
en desarrollo . Por lo general, existen mejores formas de administrar la configuración en entornos de producción, como /etc/environment
administrado por Puppet o Chef, heroku config
, etc.
Sin embargo, algunos consideran que dotenv es una forma conveniente de configurar aplicaciones Rails en entornos de prueba y producción, y puede hacerlo definiendo archivos específicos del entorno como .env.production
o .env.test
.
Si utiliza esta gema para manejar variables de entorno para múltiples entornos Rails (desarrollo, prueba, producción, etc.), tenga en cuenta que las variables de entorno que son generales para todos los entornos deben almacenarse en .env
. Luego, las variables de entorno específicas del entorno deben almacenarse en .env.
.
Solo se debe poder acceder a las credenciales en las máquinas que necesitan acceder a ellas. Nunca envíe información confidencial a un repositorio que no sea necesario para todas las máquinas y servidores de desarrollo.
Personalmente, prefiero enviar el archivo .env
con configuraciones de solo desarrollo. Esto facilita que otros desarrolladores comiencen con el proyecto sin comprometer las credenciales de otros entornos. Si sigue este consejo, asegúrese de que todas las credenciales para su entorno de desarrollo sean diferentes de sus otras implementaciones y que las credenciales de desarrollo no tengan acceso a ningún dato confidencial.
ENV
existentes? De forma predeterminada, no sobrescribirá las variables de entorno existentes, ya que dotenv supone que el entorno de implementación tiene más conocimiento sobre la configuración que la aplicación. Para sobrescribir las variables de entorno existentes, puede utilizar Dotenv.load files, overwrite: true
.
También puede utilizar el indicador -o
o --overwrite
en dotenv cli para sobrescribir las variables ENV
existentes.
$ dotenv -o -f " .env.local,.env "
Si desea tener una mejor idea de cómo funciona dotenv, consulte la lectura de código de Ruby Rogues de dotenv.
git checkout -b my-new-feature
)git commit -am 'Added some feature'
)git push origin my-new-feature
)