Na maioria das vezes, eu armazeno a configuração do aplicativo de desenvolvimento no diretório raiz do projeto, assim:
app
|-- config.json
Mas essa não parece ser a melhor abordagem, pois essa configuração acaba sendo armazenada no sistema de controle de versão - possivelmente resultando em nomes de usuário, senhas e outras coisas confidenciais vazadas.
O guia 12 Factor App recomenda eliminar completamente os arquivos de configuração e usar variáveis de ambiente para a instalação:
... armazena a configuração em variáveis de ambiente. Os envs são fáceis de alterar entre implantações sem alterar nenhum código; ao contrário dos arquivos de configuração, há pouca chance deles serem verificados no repositório de códigos acidentalmente; e, diferentemente dos arquivos de configuração personalizados ou de outros mecanismos de configuração, como as Propriedades do sistema Java, eles são um padrão independente de idioma e sistema operacional.
Isso me parece muito bom, mas onde se armazena essas variáveis de ambiente, sem as verificar no controle de origem? E quais ferramentas posso usar para passar essas variáveis para o aplicativo? Pode haver dezenas de opções de configuração, e digitá-las manualmente sempre que você inicia o aplicativo não é bom - portanto, elas precisam ser armazenadas em algum tipo de arquivo em algum lugar. O arquivo, portanto, acabará no controle de origem e voltaremos para onde começamos.
Existe alguma maneira universalmente aceita de lidar com opções de configuração, que não corre o risco de armazenar a configuração local no controle de origem?
.gitignore
onde eu posso definir arquivos ou pastas que não devem ser verificados no controle de versão. Como você diz, não vejo onde o Env vars realmente deve ajudar, mas você tem um script para defini-los e deve ser armazenado junto com o projeto ou você os encontra em algum lugar do seu sistema (diretório inicial ou mesmo na inicialização da máquina) scripts), que parece criar muitos problemas por si só, especialmente se muita configuração for necessária. De qualquer forma, eu dividiria os arquivos de configuração para que as informações confidenciais fossem inseridas em arquivos diferentes.