|
<div align="center"> |
|
🎉 announcing <a href="https://github.com/dotenvx/dotenvx">dotenvx</a>. <em>run anywhere, multi-environment, encrypted envs</em>. |
|
</div> |
|
|
|
|
|
|
|
<div align="center"> |
|
|
|
<p> |
|
<sup> |
|
<a href="https://github.com/sponsors/motdotla">Dotenv es apoyado por la comunidad.</a> |
|
</sup> |
|
</p> |
|
<sup>Gracias espaciales a:</sup> |
|
<br> |
|
<br> |
|
<a href="https://www.warp.dev/?utm_source=github&utm_medium=referral&utm_campaign=dotenv_p_20220831"> |
|
<div> |
|
<img src="https://res.cloudinary.com/dotenv-org/image/upload/v1661980709/warp_hi8oqj.png" width="230" alt="Warp"> |
|
</div> |
|
<b>Warp es una rápida e impresionante terminal basada en Rust, reinventado para funcionar como una aplicación moderna.</b> |
|
<div> |
|
<sup>Haga más en la CLI con edición de texto real, resultado básado en bloques, y busqueda de comandos de IA.</sup> |
|
</div> |
|
</a> |
|
<br> |
|
<a href="https://retool.com/?utm_source=sponsor&utm_campaign=dotenv"> |
|
<div> |
|
<img src="https://res.cloudinary.com/dotenv-org/image/upload/c_scale,w_300/v1664466968/logo-full-black_vidfqf.png" width="270" alt="Retool"> |
|
</div> |
|
<b>Retool ayuda a los desarrolladores a crear software interno personalizado, como aplicaciones CRUD y paneles de administración, realmente rápido.</b> |
|
<div> |
|
<sup>Construya Interfaces de Usuario de forma visual con componentes flexibles, conéctese a cualquier fuente de datos, y escriba lógica de negocio en JavaScript.</sup> |
|
</div> |
|
</a> |
|
<br> |
|
<a href="https://workos.com/?utm_campaign=github_repo&utm_medium=referral&utm_content=dotenv&utm_source=github"> |
|
<div> |
|
<img src="https://res.cloudinary.com/dotenv-org/image/upload/c_scale,w_400/v1665605496/68747470733a2f2f73696e647265736f726875732e636f6d2f6173736574732f7468616e6b732f776f726b6f732d6c6f676f2d77686974652d62672e737667_zdmsbu.svg" width="270" alt="WorkOS"> |
|
</div> |
|
<b>Su Apliación, Lista para la Empresa.</b> |
|
<div> |
|
<sup>Agrega Inicio de Sesión Único, Autenticación Multi-Factor, y mucho más, en minutos en lugar de meses.</sup> |
|
</div> |
|
</a> |
|
<hr> |
|
<br> |
|
<br> |
|
<br> |
|
<br> |
|
|
|
</div> |
|
|
|
# dotenv [](https://www.npmjs.com/package/dotenv) |
|
|
|
<img src="https://raw.githubusercontent.com/motdotla/dotenv/master/dotenv.svg" alt="dotenv" align="right" width="200" /> |
|
|
|
Dotenv es un módulo de dependencia cero que carga las variables de entorno desde un archivo `.env` en [`process.env`](https://nodejs.org/docs/latest/api/process.html#process_process_env). El almacenamiento de la configuración del entorno separado del código está basado en la metodología [The Twelve-Factor App](http://12factor.net/config). |
|
|
|
[](https://github.com/feross/standard) |
|
[](LICENSE) |
|
|
|
## Instalación |
|
|
|
```bash |
|
# instalación local (recomendado) |
|
npm install dotenv --save |
|
``` |
|
|
|
O installación con yarn? `yarn add dotenv` |
|
|
|
## Uso |
|
|
|
Cree un archivo `.env` en la raíz de su proyecto: |
|
|
|
```dosini |
|
S3_BUCKET="YOURS3BUCKET" |
|
SECRET_KEY="YOURSECRETKEYGOESHERE" |
|
``` |
|
|
|
Tan prónto como sea posible en su aplicación, importe y configure dotenv: |
|
|
|
```javascript |
|
require('dotenv').config() |
|
console.log(process.env) // elimine esto después que haya confirmado que esta funcionando |
|
``` |
|
|
|
.. o usa ES6? |
|
|
|
```javascript |
|
import * as dotenv from 'dotenv' // vea en https://github.com/motdotla/dotenv#como-uso-dotenv-con-import |
|
// REVISAR LINK DE REFERENCIA DE IMPORTACIÓN |
|
dotenv.config() |
|
import express from 'express' |
|
``` |
|
|
|
Eso es todo. `process.env` ahora tiene las claves y los valores que definiste en tu archivo `.env`: |
|
|
|
```javascript |
|
require('dotenv').config() |
|
|
|
... |
|
|
|
s3.getBucketCors({Bucket: process.env.S3_BUCKET}, function(err, data) {}) |
|
``` |
|
|
|
### Valores multilínea |
|
|
|
Si necesita variables de varias líneas, por ejemplo, claves privadas, ahora se admiten en la versión (`>= v15.0.0`) con saltos de línea: |
|
|
|
```dosini |
|
PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY----- |
|
... |
|
Kh9NV... |
|
... |
|
-----END RSA PRIVATE KEY-----" |
|
``` |
|
|
|
Alternativamente, puede usar comillas dobles y usar el carácter `\n`: |
|
|
|
```dosini |
|
PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----\nKh9NV...\n-----END RSA PRIVATE KEY-----\n" |
|
``` |
|
|
|
### Comentarios |
|
|
|
Los comentarios pueden ser agregados en tu archivo o en la misma línea: |
|
|
|
```dosini |
|
# This is a comment |
|
SECRET_KEY=YOURSECRETKEYGOESHERE # comment |
|
SECRET_HASH="something-with-a-#-hash" |
|
``` |
|
|
|
Los comentarios comienzan donde existe un `#`, entonces, si su valor contiene un `#`, enciérrelo entre comillas. Este es un cambio importante desde la versión `>= v15.0.0` en adelante. |
|
|
|
### Análisis |
|
|
|
El motor que analiza el contenido de su archivo que contiene variables de entorno está disponible para su uso. Este Acepta una Cadena o un Búfer y devolverá un Objeto con las claves y los valores analizados. |
|
|
|
```javascript |
|
const dotenv = require('dotenv') |
|
const buf = Buffer.from('BASICO=basico') |
|
const config = dotenv.parse(buf) // devolverá un objeto |
|
console.log(typeof config, config) // objeto { BASICO : 'basico' } |
|
``` |
|
|
|
### Precarga |
|
|
|
Puede usar el `--require` (`-r`) [opción de línea de comando](https://nodejs.org/api/cli.html#-r---require-module) para precargar dotenv. Al hacer esto, no necesita requerir ni cargar dotnev en el código de su aplicación. |
|
|
|
```bash |
|
$ node -r dotenv/config tu_script.js |
|
``` |
|
|
|
Las opciones de configuración a continuación se admiten como argumentos de línea de comandos en el formato `dotenv_config_<option>=value` |
|
|
|
```bash |
|
$ node -r dotenv/config tu_script.js dotenv_config_path=/custom/path/to/.env dotenv_config_debug=true |
|
``` |
|
|
|
Además, puede usar variables de entorno para establecer opciones de configuración. Los argumentos de línea de comandos precederán a estos. |
|
|
|
```bash |
|
$ DOTENV_CONFIG_<OPTION>=value node -r dotenv/config tu_script.js |
|
``` |
|
|
|
```bash |
|
$ DOTENV_CONFIG_ENCODING=latin1 DOTENV_CONFIG_DEBUG=true node -r dotenv/config tu_script.js dotenv_config_path=/custom/path/to/.env |
|
``` |
|
|
|
### Expansión Variable |
|
|
|
Necesitaras agregar el valor de otro variable en una de sus variables? Usa [dotenv-expand](https://github.com/motdotla/dotenv-expand). |
|
|
|
### Sincronizando |
|
|
|
Necesitas mentener sincronizados los archivos `.env` entre maquinas, entornos, o miembros del equipo? Usa |
|
[dotenv-vault](https://github.com/dotenv-org/dotenv-vault). |
|
|
|
## Ejemplos |
|
|
|
Vea [ejemplos](https://github.com/dotenv-org/examples) sobre el uso de dotenv con varios frameworks, lenguajes y configuraciones. |
|
|
|
* [nodejs](https://github.com/dotenv-org/examples/tree/master/dotenv-nodejs) |
|
* [nodejs (depurar en)](https://github.com/dotenv-org/examples/tree/master/dotenv-nodejs-debug) |
|
* [nodejs (anular en)](https://github.com/dotenv-org/examples/tree/master/dotenv-nodejs-override) |
|
* [esm](https://github.com/dotenv-org/examples/tree/master/dotenv-esm) |
|
* [esm (precarga)](https://github.com/dotenv-org/examples/tree/master/dotenv-esm-preload) |
|
* [typescript](https://github.com/dotenv-org/examples/tree/master/dotenv-typescript) |
|
* [typescript parse](https://github.com/dotenv-org/examples/tree/master/dotenv-typescript-parse) |
|
* [typescript config](https://github.com/dotenv-org/examples/tree/master/dotenv-typescript-config) |
|
* [webpack](https://github.com/dotenv-org/examples/tree/master/dotenv-webpack) |
|
* [webpack (plugin)](https://github.com/dotenv-org/examples/tree/master/dotenv-webpack2) |
|
* [react](https://github.com/dotenv-org/examples/tree/master/dotenv-react) |
|
* [react (typescript)](https://github.com/dotenv-org/examples/tree/master/dotenv-react-typescript) |
|
* [express](https://github.com/dotenv-org/examples/tree/master/dotenv-express) |
|
* [nestjs](https://github.com/dotenv-org/examples/tree/master/dotenv-nestjs) |
|
|
|
## Documentación |
|
|
|
Dotenv expone dos funciones: |
|
|
|
* `configuración` |
|
* `analizar` |
|
|
|
### Configuración |
|
|
|
`Configuración` leerá su archivo `.env`, analizará el contenido, lo asignará a [`process.env`](https://nodejs.org/docs/latest/api/process.html#process_process_env), |
|
y devolverá un Objeto con una clave `parsed` que contiene el contenido cargado o una clave `error` si falla. |
|
|
|
```js |
|
const result = dotenv.config() |
|
|
|
if (result.error) { |
|
throw result.error |
|
} |
|
|
|
console.log(result.parsed) |
|
``` |
|
|
|
Adicionalmente, puede pasar opciones a `configuracion`. |
|
|
|
#### Opciones |
|
|
|
##### Ruta |
|
|
|
Por defecto: `path.resolve(process.cwd(), '.env')` |
|
|
|
Especifique una ruta personalizada si el archivo que contiene las variables de entorno se encuentra localizado en otro lugar. |
|
|
|
```js |
|
require('dotenv').config({ path: '/personalizado/ruta/a/.env' }) |
|
``` |
|
|
|
##### Codificación |
|
|
|
Por defecto: `utf8` |
|
|
|
Especifique la codificación del archivo que contiene las variables de entorno. |
|
|
|
```js |
|
require('dotenv').config({ encoding: 'latin1' }) |
|
``` |
|
|
|
##### Depurar |
|
|
|
Por defecto: `false` |
|
|
|
Active el registro de ayuda para depurar por qué ciertas claves o valores no se inician como lo esperabas. |
|
|
|
```js |
|
require('dotenv').config({ debug: process.env.DEBUG }) |
|
``` |
|
|
|
##### Anular |
|
|
|
Por defecto: `false` |
|
|
|
Anule cualquier variable de entorno que ya se haya configurada en su maquina con los valores de su archivo .env. |
|
|
|
```js |
|
require('dotenv').config({ override: true }) |
|
``` |
|
|
|
### Analizar |
|
|
|
El motor que analiza el contenido del archivo que contiene las variables de entorno está disponible para su uso. Acepta una Cadena o un Búfer y retornará un objecto con los valores analizados. |
|
|
|
```js |
|
const dotenv = require('dotenv') |
|
const buf = Buffer.from('BASICO=basico') |
|
const config = dotenv.parse(buf) // devolverá un objeto |
|
console.log(typeof config, config) // objeto { BASICO : 'basico' } |
|
``` |
|
|
|
#### Opciones |
|
|
|
##### Depurar |
|
|
|
Por defecto: `false` |
|
|
|
Active el registro de ayuda para depurar por qué ciertas claves o valores no se inician como lo esperabas. |
|
|
|
```js |
|
const dotenv = require('dotenv') |
|
const buf = Buffer.from('hola mundo') |
|
const opt = { debug: true } |
|
const config = dotenv.parse(buf, opt) |
|
// espere por un mensaje de depuración porque el búfer no esta listo KEY=VAL |
|
``` |
|
|
|
## FAQ |
|
|
|
### ¿Por qué el archivo `.env` no carga mis variables de entorno correctamente? |
|
|
|
Lo más probable es que su archivo `.env` no esté en el lugar correcto. [Vea este stack overflow](https://stackoverflow.com/questions/42335016/dotenv-file-is-not-loading-environment-variables). |
|
|
|
Active el modo de depuración y vuelva a intentarlo... |
|
|
|
```js |
|
require('dotenv').config({ debug: true }) |
|
``` |
|
|
|
Recibirá un error apropiado en su consola. |
|
|
|
### ¿Debo confirmar mi archivo `.env`? |
|
|
|
No. Recomendamos **enfáticamente** no enviar su archivo `.env` a la versión de control. Solo debe incluir los valores especificos del entorno, como la base de datos, contraseñas o claves API. |
|
|
|
### ¿Debería tener multiples archivos `.env`? |
|
|
|
No. Recomendamos **enfáticamente** no tener un archivo `.env` "principal" y un archivo `.env` de "entorno" como `.env.test`. Su configuración debe variar entre implementaciones y no debe compartir valores entre entornos. |
|
|
|
> En una Aplicación de Doce Factores, las variables de entorno son controles diferenciados, cada uno totalmente independiente a otras variables de entorno. Nunca se agrupan como "entornos", sino que se gestionan de manera independiente para cada despliegue. Este es un modelo que se escala sin problemas a medida que la aplicación se expande de forma natural en más despliegues a lo largo de su vida. |
|
> |
|
> – [La Apliación de los Doce Factores](https://12factor.net/es/) |
|
|
|
### ¿Qué reglas sigue el motor de análisis? |
|
|
|
El motor de análisis actualmente admite las siguientes reglas: |
|
|
|
- `BASICO=basico` se convierte en `{BASICO: 'basico'}` |
|
- las líneas vacías se saltan |
|
- las líneas que comienzan con `#` se tratan como comentarios |
|
- `#` marca el comienzo de un comentario (a menos que el valor esté entre comillas) |
|
- valores vacíos se convierten en cadenas vacías (`VACIO=` se convierte en `{VACIO: ''}`) |
|
- las comillas internas se mantienen (piensa en JSON) (`JSON={"foo": "bar"}` se convierte en `{JSON:"{\"foo\": \"bar\"}"`) |
|
- los espacios en blanco se eliminan de ambos extremos de los valores no citanos (aprende más en [`trim`](https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Global_Objects/String/Trim)) (`FOO= algo ` se convierte en `{FOO: 'algo'}`) |
|
- los valores entre comillas simples y dobles se escapan (`CITA_SIMPLE='citado'` se convierte en `{CITA_SIMPLE: "citado"}`) |
|
- los valores entre comillas simples y dobles mantienen los espacios en blanco en ambos extremos (`FOO=" algo "` se convierte en `{FOO: ' algo '}`) |
|
- los valores entre comillas dobles expanden nuevas líneas (`MULTILINEA="nueva\nlínea"` se convierte en |
|
|
|
``` |
|
{MULTILINEA: 'nueva |
|
línea'} |
|
``` |
|
|
|
- se admite la comilla simple invertida (`` SIGNO_ACENTO=`Esto tiene comillas 'simples' y "dobles" en su interior.` ``) |
|
|
|
### ¿Qué sucede con las variables de entorno que ya estaban configuradas? |
|
|
|
Por defecto, nunca modificaremos ninguna variable de entorno que ya haya sido establecida. En particular, si hay una variable en su archivo `.env` que colisiona con una que ya existe en su entorno, entonces esa variable se omitirá. |
|
|
|
Si por el contrario, quieres anular `process.env` utiliza la opción `override`. |
|
|
|
```javascript |
|
require('dotenv').config({ override: true }) |
|
``` |
|
|
|
### ¿Por qué mis variables de entorno no aparecen para React? |
|
|
|
Su código React se ejecuta en Webpack, donde el módulo `fs` o incluso el propio `process` global no son accesibles fuera-de-la-caja. El módulo `process.env` sólo puede ser inyectado a través de la configuración de Webpack. |
|
|
|
Si estás usando [`react-scripts`](https://www.npmjs.com/package/react-scripts), el cual se distribuye a través de [`create-react-app`](https://create-react-app.dev/), tiene dotenv incorporado pero con una singularidad. Escriba sus variables de entorno con `REACT_APP_`. Vea [este stack overflow](https://stackoverflow.com/questions/42182577/is-it-possible-to-use-dotenv-in-a-react-project) para más detalles. |
|
|
|
Si estás utilizando otros frameworks (por ejemplo, Next.js, Gatsby...), debes consultar su documentación para saber cómo injectar variables de entorno en el cliente. |
|
|
|
### ¿Puedo personalizar/escribir plugins para dotenv? |
|
|
|
Sí! `dotenv.config()` devuelve un objeto que representa el archivo `.env` analizado. Esto te da todo lo que necesitas para poder establecer valores en `process.env`. Por ejemplo: |
|
|
|
```js |
|
const dotenv = require('dotenv') |
|
const variableExpansion = require('dotenv-expand') |
|
const miEnv = dotenv.config() |
|
variableExpansion(miEnv) |
|
``` |
|
|
|
### Cómo uso dotnev con `import`? |
|
|
|
Simplemente.. |
|
|
|
```javascript |
|
// index.mjs (ESM) |
|
import * as dotenv from 'dotenv' // vea https://github.com/motdotla/dotenv#como-uso-dotenv-con-import |
|
dotenv.config() |
|
import express from 'express' |
|
``` |
|
|
|
Un poco de historia... |
|
|
|
> Cuando se ejecuta un módulo que contiene una sentencia `import`, los módulos que importa serán cargados primero, y luego se ejecuta cada bloque del módulo en un recorrido en profundidad del gráfico de dependencias, evitando los ciclos al saltarse todo lo que ya se ha ejecutado. |
|
> |
|
> – [ES6 en Profundidad: Módulos](https://hacks.mozilla.org/2015/08/es6-in-depth-modules/) |
|
|
|
¿Qué significa esto en lenguaje sencillo? Significa que se podrías pensar que lo siguiente funcionaría pero no lo hará. |
|
|
|
```js |
|
// notificarError.mjs |
|
import { Cliente } from 'mejor-servicio-para-notificar-error' |
|
|
|
export default new Client(process.env.CLAVE_API) |
|
|
|
// index.mjs |
|
import dotenv from 'dotenv' |
|
dotenv.config() |
|
|
|
import notificarError from './notificarError.mjs' |
|
notificarError.report(new Error('ejemplo documentado')) |
|
``` |
|
|
|
`process.env.CLAVE_API` será vacio. |
|
|
|
En su lugar, el código anterior debe ser escrito como... |
|
|
|
```js |
|
// notificarError.mjs |
|
import { Cliente } from 'mejor-servicio-para-notificar-errores' |
|
|
|
export default new Client(process.env.CLAVE_API) |
|
|
|
// index.mjs |
|
import * as dotenv from 'dotenv' |
|
dotenv.config() |
|
|
|
import notificarError from './notificarError.mjs' |
|
notificarError.report(new Error('ejemplo documentado')) |
|
``` |
|
|
|
¿Esto tiene algo de sentido? Esto es poco poco intuitivo, pero es como funciona la importación de módulos en ES6. Aquí hay un ejemplo [ejemplo práctico de esta trampa](https://github.com/dotenv-org/examples/tree/master/dotenv-es6-import-pitfall). |
|
|
|
Existen dos arternativas a este planteamiento: |
|
|
|
1. Precarga dotenv: `node --require dotenv/config index.js` (_Nota: no es necesario usar `import` dotenv con este método_) |
|
2. Cree un archivo separado que ejecutará `config` primero como se describe en [este comentario #133](https://github.com/motdotla/dotenv/issues/133#issuecomment-255298822) |
|
|
|
### ¿Qué pasa con la expansión de variable? |
|
|
|
Prueba [dotenv-expand](https://github.com/motdotla/dotenv-expand) |
|
|
|
### ¿Qué pasa con la sincronización y la seguridad de los archivos .env? |
|
|
|
Vea [dotenv-vault](https://github.com/dotenv-org/dotenv-vault) |
|
|
|
## Guía de contribución |
|
|
|
Vea [CONTRIBUTING.md](CONTRIBUTING.md) |
|
|
|
## REGISTRO DE CAMBIOS |
|
|
|
Vea [CHANGELOG.md](CHANGELOG.md) |
|
|
|
## ¿Quiénes utilizan dotenv? |
|
|
|
[Estos módulos npm dependen de él.](https://www.npmjs.com/browse/depended/dotenv) |
|
|
|
Los proyectos que lo amplían suelen utilizar la [palabra clave "dotenv" en npm](https://www.npmjs.com/search?q=keywords:dotenv). |
|
|