La mayoría de las veces, almaceno la configuración de la aplicación de desarrollo en el directorio raíz del proyecto, así:
app
|-- config.json
Pero ese no parece ser el mejor enfoque, ya que esta configuración termina siendo almacenada en el sistema de control de versiones, posiblemente resultando en filtraciones de nombres de usuario, contraseñas y otras cosas confidenciales.
La guía de aplicaciones de 12 Factor recomienda soltar los archivos de configuración por completo y usar variables de entorno para la configuración de la configuración:
... almacena la configuración en variables de entorno. Las variables de entorno son fáciles de cambiar entre implementaciones sin cambiar ningún código; a diferencia de los archivos de configuración, hay pocas posibilidades de que se registren accidentalmente en el repositorio de código; y, a diferencia de los archivos de configuración personalizados u otros mecanismos de configuración, como las Propiedades del sistema Java, son un estándar independiente del lenguaje y del sistema operativo.
Eso me suena muy bien, pero ¿dónde se almacenan dichas variables de entorno, sin registrarlas en el control de origen? ¿Y qué herramientas puedo usar para pasar esas variables a la aplicación? Puede haber docenas de opciones de configuración, y escribirlas a mano cada vez que inicia la aplicación no es agradable, por lo que deben almacenarse en algún tipo de archivo en algún lugar. Dicho archivo terminará así en el control de origen, y volveremos a donde comenzamos.
¿Existe alguna forma universalmente aceptada de manejar las opciones de configuración, que no tenga el riesgo de almacenar la configuración local en el control de origen?
.gitignore
donde puedo definir archivos o carpetas que no deberían ser controlados en el control de versiones. Como usted dice, no veo dónde realmente debería ayudar Env vars, ya que tiene un script para configurarlos y debe almacenarse junto con el proyecto o los tiene 'en algún lugar' en su sistema (directorio de inicio o incluso en el inicio de las máquinas scripts) que parece crear muchos problemas por sí solo, especialmente si se necesita mucha configuración. En cualquier caso, dividiría los archivos de configuración para que la información confidencial vaya en diferentes archivos.