Shim para carregar variáveis de ambiente de .env
em ENV
em desenvolvimento .
Armazenar a configuração no ambiente é um dos princípios de um aplicativo de doze fatores. Qualquer coisa que possa mudar entre ambientes de implantação – como identificadores de recursos para bancos de dados ou credenciais para serviços externos – deve ser extraída do código em variáveis de ambiente.
Mas nem sempre é prático definir variáveis de ambiente em máquinas de desenvolvimento ou servidores de integração contínua onde vários projetos são executados. dotenv carrega variáveis de um arquivo .env
no ENV
quando o ambiente é inicializado.
Adicione esta linha ao topo do Gemfile do seu aplicativo e execute bundle install
:
gem 'dotenv' , groups : [ :development , :test ]
Adicione a configuração do seu aplicativo ao arquivo .env
na raiz do seu projeto:
S3_BUCKET=YOURS3BUCKET
SECRET_KEY=YOURSECRETKEYGOESHERE
Sempre que sua aplicação for carregada, estas variáveis estarão disponíveis em ENV
:
config . fog_directory = ENV [ 'S3_BUCKET' ]
Consulte a documentação da API para obter mais informações.
Dotenv será carregado automaticamente quando seu aplicativo Rails inicializar. Veja Personalizando Rails para alterar quais arquivos são carregados e quando.
Carregue o Dotenv o mais cedo possível no processo de inicialização do seu aplicativo:
require 'dotenv/load'
# or
require 'dotenv'
Dotenv . load
Por padrão, load
procurará um arquivo chamado .env
no diretório de trabalho atual. Passe vários arquivos e eles serão carregados em ordem. O primeiro valor definido para uma variável vencerá.
require 'dotenv'
Dotenv . load ( 'file1.env' , 'file2.env' )
Desde a versão 3.0, o dotenv em um aplicativo Rails irá restaurar automaticamente ENV
após cada teste. Isso significa que você pode modificar ENV
em seus testes sem medo de vazar o estado para outros testes. Funciona com ActiveSupport::TestCase
e Rspec
.
Para desabilitar esse comportamento, defina config.dotenv.autorestore = false
em config/application.rb
ou config/environments/test.rb
. Ele está desabilitado por padrão se seu aplicativo usar Climate_Control ou Ice_age.
Para usar esse comportamento fora de um aplicativo Rails, basta require "dotenv/autorestore"
em seu conjunto de testes.
Consulte Dotenv.save
, Dotenv.restore e Dotenv.modify(hash) { ... }
para uso manual.
Para garantir que .env
seja carregado no rake, carregue as tarefas:
require 'dotenv/tasks'
task mytask : :dotenv do
# things that require .env
end
Você pode usar o executável load .env
dotenv
antes de iniciar seu aplicativo:
$ dotenv ./script.rb
O executável dotenv
também aceita o sinalizador -f
. Seu valor deve ser uma lista de arquivos de configuração separados por vírgulas, na ordem do mais importante para o menos importante. Todos os arquivos devem existir. Deve haver um espaço entre a bandeira e seu valor.
$ dotenv -f " .env.local,.env " ./script.rb
O executável dotenv
pode opcionalmente ignorar arquivos ausentes com o sinalizador -i
ou --ignore
. Por exemplo, se o arquivo .env.local
não existir, o seguinte irá ignorar o arquivo ausente e carregar apenas o arquivo .env
.
$ dotenv -i -f " .env.local,.env " ./script.rb
Se você usar gemas que exigem que variáveis de ambiente sejam definidas antes de serem carregadas, liste dotenv
no Gemfile
antes dessas outras gemas e require dotenv/load
.
gem 'dotenv' , require : 'dotenv/load'
gem 'gem-that-requires-env-variables'
Dotenv carregará os seguintes arquivos dependendo de RAILS_ENV
, com o primeiro arquivo tendo a precedência mais alta e .env
tendo a precedência mais baixa:
Prioridade | Ambiente | .gitignore isso? | Notas | ||
---|---|---|---|---|---|
desenvolvimento | teste | produção | |||
mais alto | .env.development.local | .env.test.local | .env.production.local | Sim | Substituições locais específicas do ambiente |
2º | .env.local | N / D | .env.local | Sim | Substituições locais |
3º | .env.development | .env.test | .env.production | Não | Variáveis específicas do ambiente compartilhadas |
durar | .env | .env | .env | Talvez | Compartilhado para todos os ambientes |
Esses arquivos são carregados durante o retorno de chamada before_configuration
, que é acionado quando a constante Application
é definida em config/application.rb
com class Application < Rails::Application
. Se precisar inicializá-lo mais cedo ou precisar personalizar o processo de carregamento, você pode fazer isso na 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
Opções disponíveis:
Dotenv::Rails.files
- lista de arquivos a serem carregados, em ordem de precedência.Dotenv::Rails.overwrite
- Substitui variáveis ENV
existentes pelo conteúdo de arquivos .env*
Dotenv::Rails.logger
- O logger a ser usado para registro do dotenv. O padrão é Rails.logger
Dotenv::Rails.autorestore
- Habilitar ou desabilitar restauração automáticaValores multilinhas com quebras de linha devem ser colocados entre aspas duplas.
PRIVATE_KEY= " -----BEGIN RSA PRIVATE KEY-----
...
HkVN9...
...
-----END DSA PRIVATE KEY----- "
Antes da versão 3.0, dotenv substituía n
nas strings entre aspas por uma nova linha, mas esse comportamento está obsoleto. Para usar o comportamento antigo, defina DOTENV_LINEBREAK_MODE=legacy
antes de qualquer variável que inclua n
:
DOTENV_LINEBREAK_MODE=legacy
PRIVATE_KEY= " -----BEGIN RSA PRIVATE KEY-----nHkVN9...n-----END DSA PRIVATE KEY-----n "
Você precisa adicionar a saída de um comando em uma de suas variáveis? Basta adicioná-lo com $(your_command)
:
DATABASE_URL= " postgres:// $( whoami ) @localhost/my_database "
Você precisa adicionar o valor de outra variável em uma de suas variáveis? Você pode referenciar a variável com ${VAR}
ou geralmente apenas $VAR
em valores sem cotação ou entre aspas duplas.
DATABASE_URL= " postgres:// ${USER} @localhost/my_database "
Se um valor contiver $
e não for uma variável, coloque-o entre aspas simples.
PASSWORD= ' pas$word '
Comentários podem ser adicionados ao seu arquivo como tal:
# This is a comment
SECRET_KEY=YOURSECRETKEYGOESHERE # comment
SECRET_HASH= " something-with-a-#-hash "
Para compatibilidade, você também pode adicionar export
na frente de cada linha para poder source
o arquivo no bash:
export S3_BUCKET=YOURS3BUCKET
export SECRET_KEY=YOURSECRETKEYGOESHERE
Se um valor de configuração específico for necessário, mas não definido, é apropriado gerar um erro.
Para exigir chaves de configuração:
# config/initializers/dotenv.rb
Dotenv . require_keys ( "SERVICE_APP_ID" , "SERVICE_KEY" , "SERVICE_SECRET" )
Se alguma das chaves de configuração acima não for definida, seu aplicativo gerará um erro durante a inicialização. Este método é preferido porque evita erros de tempo de execução em um aplicativo de produção devido a configuração inadequada.
Para analisar uma lista de arquivos env para inspeção programática sem modificar o ENV:
Dotenv . parse ( ".env.local" , ".env" )
# => {'S3_BUCKET' => 'YOURS3BUCKET', 'SECRET_KEY' => 'YOURSECRETKEYGOESHERE', ...}
Este método retorna um hash dos pares nome/valor da var ENV.
Você pode usar o sinalizador -t
ou --template
no dotenv cli para criar um modelo do seu arquivo .env
.
$ dotenv -t .env
Um modelo será criado em seu diretório de trabalho chamado {FILENAME}.template
. Portanto, no exemplo acima, seria criado um arquivo .env.template
.
O modelo conterá todas as variáveis de ambiente em seu arquivo .env
, mas com seus valores definidos para os nomes das variáveis.
# .env
S3_BUCKET=YOURS3BUCKET
SECRET_KEY=YOURSECRETKEYGOESHERE
Se tornaria
# .env.template
S3_BUCKET=S3_BUCKET
SECRET_KEY=SECRET_KEY
dotenv foi originalmente criado para carregar variáveis de configuração no ENV
em desenvolvimento . Normalmente existem maneiras melhores de gerenciar configurações em ambientes de produção - como /etc/environment
gerenciado por Puppet ou Chef, heroku config
, etc.
No entanto, alguns consideram o dotenv uma maneira conveniente de configurar aplicativos Rails em ambientes de teste e produção, e você pode fazer isso definindo arquivos específicos do ambiente, como .env.production
ou .env.test
.
Se você usar esta gem para lidar com env vars para vários ambientes Rails (desenvolvimento, teste, produção, etc.), observe que env vars que são gerais para todos os ambientes devem ser armazenados em .env
. Em seguida, os env vars específicos do ambiente devem ser armazenados em .env.<that environment's name>
.
As credenciais só devem estar acessíveis nas máquinas que precisam de acesso a elas. Nunca envie informações confidenciais para um repositório que não seja necessário para todas as máquinas e servidores de desenvolvimento.
Pessoalmente, prefiro enviar o arquivo .env
com configurações somente de desenvolvimento. Isso torna mais fácil para outros desenvolvedores iniciarem o projeto sem comprometer as credenciais de outros ambientes. Se você seguir este conselho, certifique-se de que todas as credenciais do seu ambiente de desenvolvimento sejam diferentes das suas outras implantações e que as credenciais de desenvolvimento não tenham acesso a quaisquer dados confidenciais.
ENV
existentes? Por padrão, ele não substituirá as variáveis de ambiente existentes, pois o dotenv assume que o ambiente de implantação tem mais conhecimento sobre configuração do que o aplicativo. Para substituir variáveis de ambiente existentes, você pode usar Dotenv.load files, overwrite: true
.
Você também pode usar o sinalizador -o
ou --overwrite
no dotenv cli para substituir variáveis ENV
existentes.
$ dotenv -o -f " .env.local,.env "
Se você quiser uma ideia melhor de como o dotenv funciona, verifique a leitura de código Ruby Rogues do dotenv.
git checkout -b my-new-feature
)git commit -am 'Added some feature'
)git push origin my-new-feature
)