Este podría ser un buen lugar para utilizar npm-config.
Al ejecutar secuencias de comandos (ver NPM-scripts (7)) package.json las teclas "config" se sobreescriben en el medio ambiente si hay un parámetro de configuración de <name>[@<version>]:<key>
yo no usaría para cada tipo de configuración de configuración variable, pero creo que es una buena solución para casos simples como URL y puertos porque:
- Los pones directamente en package.json.
- Además, puede especificarlos en la línea de comando o como variables ENV.
- Cualquier cosa que se ejecute a través de npm puede hacer referencia a ellos (por ejemplo, scripts).
- Puede ponerlos por usuario con `NPM config set foo: puerto 80
La única salvedad es que el parámetro config
en su package.json solamente se exporta de forma automática en el medio ambiente cuando se ejecuta el código de a través de npm. Por lo tanto, si solo lo ejecuta con un nodo, como, node ./myapp.js
, entonces no puede esperar que process.env.npm_package_config_foo
contenga su valor. Sin embargo, siempre puede var pkg = require('./package.json');
y acceder a los valores en pkg.config
.
Como puede que no sea obvio de inmediato, también agregaría que las variables de entorno npm_package_config
no aparecen en las aplicaciones que dependen de su paquete npm. Entonces, si su paquete dependiente se refiere a process.env.npm_package_config_foo
, entonces el paquete dependiente debería definir eso en su propio paquete.json. Supongo que dado que es un "npm_package_config", no tendría sentido empujarlos por todo el árbol.
Entonces, ¿cómo usaría una variable de configuración de npm y la haría funcionar en todo el árbol, tanto en el paquete base como en los paquetes que dependen de él? En realidad es un poco confuso, y tuve que resolver esto a través de prueba y error.
Digamos que usted tiene un paquete conector y empaquetar cliente. cliente depende de conector y desea especificar un parámetro de configuración para conector que puede ser utilizado o se sobrescribe en cliente. Si usa process.env.npm_package_config.port
en su módulo de conector, cuando depende del módulo cliente, entonces esa variable no se exportará y terminará como indefinido.
Sin embargo, si en lugar de utilizar process.env.npm_config_connector_port
(nótese la primera de ellas comienza con npm_package_config y el otro con npm_config_packagename), entonces al menos puede establecer que en su .npmrc usando npm config set connector:port 80
y que será "espacio de nombres" como process.env.npm__config_connector_port
todas partes que ejecute MNP, incluyendo secuencias de comandos que se ejecutan en el cliente que dependen de conector, y siempre serás capaz de sobreescribir en la línea de comandos, en su ENV, o en su .npmrc. Solo debes tener en cuenta que, como sucede con cualquier variable de entorno, es posible que no siempre esté configurada. Por lo tanto, me gustaría utilizar el operador por defecto con el process.env.npm_config_connector_port
como el primer valor (preferido):
var port = process.env.npm_config_connector_port || sane_default
Aquí, sane_default podría ser poblada desde uno de los otros métodos recomendados. Personalmente, me gusta mantener los datos de configuración como estos en los archivos JSON como mínimo, y package.json parece ser el mejor archivo JSON para colocarlos. Guárdelos en datos en lugar de codificarlos y luego puede usar fácilmente el JSON estático. en línea, generarlos dinámicamente o extraerlos del sistema de archivos, las URL o las bases de datos.
No entiendo el código de app.js. Configuré las variables en config.js pero luego, ¿cómo puedo "leerlas" en mi app.js? – donald
La última línea en ./config.js le permite exportar ese código a su archivo ./app.js. ./config.js devuelve el objeto json apropiado según su entorno, y luego establece la variable cfg en ese objeto json. Un error, sin embargo. config.something debe ser cfg.algo porque ese es el nombre de la variable que estás creando. –
Asegúrese de establecer la variable de configuración 'NODE_ENV' en su servidor de producción. Con Heroku sería 'heroku config: establecer NODE_ENV = producción'. Sin hacerlo, la última línea de 'config.js' no funcionará. –