심은 개발 시 .env
의 환경 변수를 ENV
로 로드합니다.
환경에 구성을 저장하는 것은 Twelve-Factor 앱의 원칙 중 하나입니다. 데이터베이스의 리소스 핸들이나 외부 서비스의 자격 증명 등 배포 환경 간에 변경될 가능성이 있는 모든 항목은 코드에서 환경 변수로 추출되어야 합니다.
그러나 여러 프로젝트가 실행되는 개발 시스템이나 지속적인 통합 서버에 환경 변수를 설정하는 것이 항상 실용적인 것은 아닙니다. dotenv는 환경이 부트스트랩될 때 .env
파일의 변수를 ENV
로 로드합니다.
애플리케이션의 Gemfile 상단에 다음 줄을 추가하고 bundle install
실행하세요.
gem 'dotenv' , groups : [ :development , :test ]
프로젝트 루트의 .env
파일에 애플리케이션 구성을 추가합니다.
S3_BUCKET=YOURS3BUCKET
SECRET_KEY=YOURSECRETKEYGOESHERE
애플리케이션이 로드될 때마다 ENV
에서 다음 변수를 사용할 수 있습니다.
config . fog_directory = ENV [ 'S3_BUCKET' ]
자세한 내용은 API 문서를 참조하세요.
Dotenv는 Rails 앱이 부팅될 때 자동으로 로드됩니다. 로드할 파일과 시기를 변경하려면 Rails 사용자 정의를 참조하세요.
애플리케이션 부트스트랩 프로세스에서 가능한 한 빨리 Dotenv를 로드하세요.
require 'dotenv/load'
# or
require 'dotenv'
Dotenv . load
기본적으로 load
현재 작업 디렉터리에서 .env
라는 파일을 찾습니다. 여러 파일을 전달하면 순서대로 로드됩니다. 변수에 대해 설정된 첫 번째 값이 우선합니다.
require 'dotenv'
Dotenv . load ( 'file1.env' , 'file2.env' )
3.0부터 Rails 앱의 dotenv는 각 테스트 후에 자동으로 ENV
복원합니다. 즉, 상태가 다른 테스트로 유출될 염려 없이 테스트에서 ENV
수정할 수 있습니다. ActiveSupport::TestCase
및 Rspec
모두에서 작동합니다.
이 동작을 비활성화하려면 config/application.rb
또는 config/environments/test.rb
에서 config.dotenv.autorestore = false
설정하세요. 앱이 Climate_control 또는 ice_age를 사용하는 경우 기본적으로 비활성화됩니다.
Rails 앱 외부에서 이 동작을 사용하려면 테스트 모음에 require "dotenv/autorestore"
.
수동 사용법은 Dotenv.save
, Dotenv.restore 및 Dotenv.modify(hash) { ... }
참조하세요.
.env
rake에 로드되었는지 확인하려면 다음 작업을 로드하세요.
require 'dotenv/tasks'
task mytask : :dotenv do
# things that require .env
end
애플리케이션을 시작하기 전에 dotenv
실행 파일 load .env
사용할 수 있습니다.
$ dotenv ./script.rb
dotenv
실행 파일은 -f
플래그도 허용합니다. 해당 값은 가장 중요한 것부터 가장 중요한 것부터 순서대로 쉼표로 구분된 구성 파일 목록이어야 합니다. 모든 파일이 존재해야 합니다. 플래그와 해당 값 사이에는 공백이 있어야 합니다 .
$ dotenv -f " .env.local,.env " ./script.rb
dotenv
실행 파일은 선택적으로 -i
또는 --ignore
플래그를 사용하여 누락된 파일을 무시할 수 있습니다. 예를 들어 .env.local
파일이 없으면 다음은 누락된 파일을 무시하고 .env
파일만 로드합니다.
$ dotenv -i -f " .env.local,.env " ./script.rb
로드되기 전에 환경 변수를 설정해야 하는 gem을 사용하는 경우 다른 gem보다 먼저 Gemfile
에 dotenv
나열하고 dotenv/load
필요합니다.
gem 'dotenv' , require : 'dotenv/load'
gem 'gem-that-requires-env-variables'
Dotenv는 RAILS_ENV
에 따라 다음 파일을 로드합니다. 첫 번째 파일의 우선 순위가 가장 높고 .env
의 우선 순위가 가장 낮습니다.
우선 사항 | 환경 | .gitignore ? | 메모 | ||
---|---|---|---|---|---|
개발 | 시험 | 생산 | |||
제일 높은 | .env.development.local | .env.test.local | .env.production.local | 예 | 환경별 로컬 재정의 |
2위 | .env.local | 해당 없음 | .env.local | 예 | 로컬 재정의 |
3번째 | .env.development | .env.test | .env.production | 아니요 | 공유 환경별 변수 |
마지막 | .env | .env | .env | 아마도 | 모든 환경에서 공유됨 |
이러한 파일은 before_configuration
콜백 중에 로드됩니다. 이 콜백은 class Application < Rails::Application
사용하여 config/application.rb
에 Application
상수가 정의될 때 실행됩니다. 더 빨리 초기화해야 하거나 로딩 프로세스를 사용자 정의해야 하는 경우 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
사용 가능한 옵션:
Dotenv::Rails.files
- 우선순위에 따라 로드할 파일 목록입니다.Dotenv::Rails.overwrite
- 기존 ENV
변수를 .env*
파일의 내용으로 덮어씁니다.Dotenv::Rails.logger
- dotenv의 로깅에 사용할 로거입니다. 기본값은 Rails.logger
입니다.Dotenv::Rails.autorestore
- 자동 복원 활성화 또는 비활성화줄 바꿈이 있는 여러 줄 값은 큰따옴표로 묶어야 합니다.
PRIVATE_KEY= " -----BEGIN RSA PRIVATE KEY-----
...
HkVN9...
...
-----END DSA PRIVATE KEY----- "
3.0 이전에는 dotenv가 인용된 문자열의 n
개행 문자로 바꾸었지만 해당 동작은 더 이상 사용되지 않습니다. 이전 동작을 사용하려면 n
포함하는 변수 앞에 DOTENV_LINEBREAK_MODE=legacy
설정하세요.
DOTENV_LINEBREAK_MODE=legacy
PRIVATE_KEY= " -----BEGIN RSA PRIVATE KEY-----nHkVN9...n-----END DSA PRIVATE KEY-----n "
변수 중 하나에 명령 출력을 추가해야 합니까? $(your_command)
사용하여 간단히 추가하세요.
DATABASE_URL= " postgres:// $( whoami ) @localhost/my_database "
변수 중 하나에 다른 변수의 값을 추가해야 합니까? ${VAR}
사용하여 변수를 참조할 수 있으며, 인용 부호가 없거나 큰따옴표가 붙은 값에서는 $VAR
만 참조할 수도 있습니다.
DATABASE_URL= " postgres:// ${USER} @localhost/my_database "
값에 $
포함되어 있고 변수로 사용하려는 것이 아닌 경우 작은따옴표로 묶습니다.
PASSWORD= ' pas$word '
다음과 같이 파일에 댓글을 추가할 수 있습니다.
# This is a comment
SECRET_KEY=YOURSECRETKEYGOESHERE # comment
SECRET_HASH= " something-with-a-#-hash "
호환성을 위해 각 줄 앞에 export
추가하여 bash에서 파일을 source
수도 있습니다.
export S3_BUCKET=YOURS3BUCKET
export SECRET_KEY=YOURSECRETKEYGOESHERE
특정 구성 값이 필요하지만 설정되지 않은 경우 오류가 발생하는 것이 적절합니다.
구성 키를 요구하려면 다음을 수행하십시오.
# config/initializers/dotenv.rb
Dotenv . require_keys ( "SERVICE_APP_ID" , "SERVICE_KEY" , "SERVICE_SECRET" )
위의 구성 키 중 하나라도 설정되지 않은 경우 초기화 중에 애플리케이션에서 오류가 발생합니다. 이 방법은 부적절한 구성으로 인한 프로덕션 애플리케이션의 런타임 오류를 방지하므로 선호됩니다.
ENV를 수정하지 않고 프로그래밍 방식 검사를 위해 env 파일 목록을 구문 분석하려면 다음을 수행하세요.
Dotenv . parse ( ".env.local" , ".env" )
# => {'S3_BUCKET' => 'YOURS3BUCKET', 'SECRET_KEY' => 'YOURSECRETKEYGOESHERE', ...}
이 메소드는 ENV var 이름/값 쌍의 해시를 반환합니다.
dotenv cli에서 -t
또는 --template
플래그를 사용하여 .env
파일의 템플릿을 생성할 수 있습니다.
$ dotenv -t .env
{FILENAME}.template
이라는 작업 디렉터리에 템플릿이 생성됩니다. 따라서 위의 예에서는 .env.template
파일을 생성합니다.
템플릿에는 .env
파일의 모든 환경 변수가 포함되지만 해당 값은 변수 이름으로 설정됩니다.
# .env
S3_BUCKET=YOURS3BUCKET
SECRET_KEY=YOURSECRETKEYGOESHERE
될 것이다
# .env.template
S3_BUCKET=S3_BUCKET
SECRET_KEY=SECRET_KEY
dotenv는 원래 개발 시 구성 변수를 ENV
에 로드하기 위해 만들어졌습니다. 일반적으로 프로덕션 환경에서 구성을 관리하는 더 나은 방법이 있습니다(예: Puppet 또는 Chef가 관리하는 /etc/environment
, heroku config
등).
그러나 일부에서는 dotenv가 스테이징 및 프로덕션 환경에서 Rails 애플리케이션을 구성하는 편리한 방법이라고 생각하며, .env.production
또는 .env.test
와 같은 환경별 파일을 정의하여 이를 수행할 수 있습니다.
이 gem을 사용하여 여러 Rails 환경(개발, 테스트, 프로덕션 등)에 대한 env 변수를 처리하는 경우 모든 환경에 일반적인 env 변수는 .env
에 저장되어야 한다는 점에 유의하세요. 그런 다음 환경별 env 변수를 .env.<that environment's name>
에 저장해야 합니다.
자격 증명은 액세스가 필요한 컴퓨터에서만 액세스할 수 있어야 합니다. 모든 개발 시스템 및 서버에 필요하지 않은 저장소에 민감한 정보를 커밋하지 마십시오.
개인적으로 저는 개발 전용 설정으로 .env
파일을 커밋하는 것을 선호합니다. 이를 통해 다른 개발자가 다른 환경에 대한 자격 증명을 손상시키지 않고 프로젝트를 쉽게 시작할 수 있습니다. 이 조언을 따르는 경우 개발 환경의 모든 자격 증명이 다른 배포와 다르며 개발 자격 증명이 기밀 데이터에 액세스할 수 없는지 확인하십시오.
ENV
변수를 덮어쓰지 않는 이유는 무엇입니까? 기본적으로 dotenv는 배포 환경이 애플리케이션보다 구성에 대해 더 많은 지식을 가지고 있다고 가정하므로 기존 환경 변수를 덮어쓰지 않습니다 . 기존 환경 변수를 덮어쓰려면 Dotenv.load files, overwrite: true
사용할 수 있습니다.
dotenv cli에서 -o
또는 --overwrite
플래그를 사용하여 기존 ENV
변수를 덮어쓸 수도 있습니다.
$ dotenv -o -f " .env.local,.env "
dotenv가 어떻게 작동하는지 더 잘 알고 싶다면 dotenv의 Ruby Rogues 코드 읽기를 확인하세요.
git checkout -b my-new-feature
).git commit -am 'Added some feature'
)git push origin my-new-feature
)