복붙노트

[RUBY-ON-RAILS] 내 코드에서 레일 개발 환경에 대한 ENV 변수를 설정할 수 있습니까?

RUBY-ON-RAILS

내 코드에서 레일 개발 환경에 대한 ENV 변수를 설정할 수 있습니까?

나는 통해 bash는 내 ENV 변수를 설정할 수 있다는 사실을 알고

export admin_password = "secret"

하지만 내 레일 소스 코드의 어딘가에서 그것을 할 수있는 방법은 무엇입니까? 내 첫 번째 시도는 환경 / development.rb이 같은 일을했다

ENV['admin_password'] = "secret"

그러나 그것은 작동하지 않았다. 이 작업을 수행 할 수있는 방법이 있나요?

해결법

  1. ==============================

    1.[최신 정보]

    [최신 정보]

    "오래된 대답"의 솔루션은 일반적인 문제에 대한 작동하지만,이 부분은 당신의 코멘트에서 해명 한 후 특정 질문에 대답하는 것입니다.

    당신은 당신의 질문에 지정 정확히 같은 환경 변수를 설정 할 수 있어야한다. 예를 들어, 나는 기본 인증을 사용하여 HTTP Heroku가 응용 프로그램을 가지고있다.

    # app/controllers/application_controller.rb
    class ApplicationController < ActionController::Base
      protect_from_forgery
      before_filter :authenticate
    
      def authenticate
        authenticate_or_request_with_http_basic do |username, password|
          username == ENV['HTTP_USER'] && password == ENV['HTTP_PASS']
        end
      end
    end
    
    # config/initializers/dev_environment.rb
    unless Rails.env.production?
      ENV['HTTP_USER'] = 'testuser'
      ENV['HTTP_PASS'] = 'testpass'
    end
    

    따라서 귀하의 경우 다음을 사용

    unless Rails.env.production?
      ENV['admin_password'] = "secret"
    end
    

    구성이 다시로드되도록 서버를 다시 시작하는 것을 잊지 마세요!

    [올드 대답]

    응용 프로그램 전체 구성의 경우 다음과 같은 솔루션을 고려해 볼 수 있습니다 :

    당신이 액세스 할 수 있도록하려면 옵션의 해시의 파일 설정 / application.yml 만들기 :

    admin_password: something_secret
    allow_registration: true
    facebook:
      app_id: application_id_here
      app_secret: application_secret_here
      api_key: api_key_here
    

    이제 파일 설정 / 초기화 / app_config.rb을 만들고 다음을 포함한다 :

    require 'yaml'
    
    yaml_data = YAML::load(ERB.new(IO.read(File.join(Rails.root, 'config', 'application.yml'))).result)
    APP_CONFIG = HashWithIndifferentAccess.new(yaml_data)
    

    다른 모든 데이터와 함께 : [admin_password 여기서] 이제 어디서나 응용 프로그램에서, 당신은 APP_CONFIG에 액세스 할 수 있습니다. (이니셜이 ERB.new이 포함되어 있기 때문에 참고, 당신 YAML 파일은 ERB 마크 업을 포함 할 수 있습니다.)

  2. ==============================

    2.절대 하드 코드 민감한 정보 (계정 인증, 암호 등). 대신, 환경 변수 (키 / 값 쌍) 등의 정보를 저장하는 파일을 생성하고, 소스 코드 관리 시스템에서 해당 파일을 제외 할 수 있습니다. 예를 들어, 힘내 (소스 코드 관리 시스템)의 관점에서, .gitignore에 추가하여 해당 파일을 제외 :

    절대 하드 코드 민감한 정보 (계정 인증, 암호 등). 대신, 환경 변수 (키 / 값 쌍) 등의 정보를 저장하는 파일을 생성하고, 소스 코드 관리 시스템에서 해당 파일을 제외 할 수 있습니다. 예를 들어, 힘내 (소스 코드 관리 시스템)의 관점에서, .gitignore에 추가하여 해당 파일을 제외 :

    -bash> echo '/config/app_environment_variables.rb' >> .gitignore 
    

    /config/app_environment_variables.rb

    ENV['HTTP_USER'] = 'devuser'
    ENV['HTTP_PASS'] = 'devpass'
    

    잘 때, Application.initialize 라인을 라인을 필요로 사이 /config/environment.rb에 다음 줄을 추가 :

    # Load the app's custom environment variables here, so that they are loaded before environments/*.rb
    app_environment_variables = File.join(Rails.root, 'config', 'app_environment_variables.rb')
    load(app_environment_variables) if File.exists?(app_environment_variables)
    

    즉입니다!

    주석 위에서 말했듯이,이 일을함으로써 당신은 환경 전 / *. RB를, 환경 변수를로드 할 것이다 당신이 그 파일 내부에 변수를 참조 할 수 있다는 것을 의미 (예를 들어, 환경 / production.rb). 이 / 설정 / 초기화 / 내부 환경 변수 파일을 퍼팅에 비해 큰 장점이다.

    내부는 소스 코드 관리 시스템에이 파일을 커밋하지 않습니다 때문에 지금까지 개발 또는 생산 등으로 환경을 구별 할 필요가 따라서는 기본적으로 개발 상황입니다,이 없다 app_environment_variables.rb. 테스트 환경에 대한 설정 뭔가 특별한 필요하지만 (또는 로컬 생산 모드를 테스트 할 경우를 위해), 단지 다른 모든 변수 아래 조건 블록을 추가 :

    if Rails.env.test?
      ENV['HTTP_USER'] = 'testuser'
      ENV['HTTP_PASS'] = 'testpass'
    end
    
    if Rails.env.production?
      ENV['HTTP_USER'] = 'produser'
      ENV['HTTP_PASS'] = 'prodpass'
    end
    

    당신이 app_environment_variables.rb 업데이트 할 때마다 응용 프로그램 서버를 다시 시작합니다. 아파치 / 승객의 좋아하는을 사용하거나 서버를 레일하는 가정 :

    -bash> touch tmp/restart.txt
    

    다음과 같이 코드에서 환경 변수를 참조하십시오

    def authenticate
      authenticate_or_request_with_http_basic do |username, password|
        username == ENV['HTTP_USER'] && password == ENV['HTTP_PASS']
      end
    end
    

    내부 app_environment_variables.rb 당신이 문자열로 논리 값과 숫자를 지정해야합니다 (단지 거짓하지 예를 들어, ENV [ 'SEND_MAIL'] = '거짓'을, 그리고 ENV [ '시간 초과'] = '30'30되지 않음), 그렇지 않으면 당신은 얻을 것이다 주 오류는 문자열로 거짓을 변환 할 수 없습니다 각각의 문자열로 Fixnum이라는 변환 할 수 없습니다.

    저장 및 민감한 정보를 공유

    넥타이의 마지막 매듭은 다음과 같습니다 고객 및 / 또는 파트너와 민감한 정보를 공유하는 방법을? 비즈니스 연속성의 목적 (즉, 당신이 떨어지는 별에 치여 죽게 언제, 어떻게 고객 및 / 또는 파트너 사이트의 전체 작업을 재개 할 것인가?), 고객 및 / 또는 파트너 앱에 필요한 모든 자격 증명을 알아야 . 이메일 전송 / 주변이 일을 Skyping은 혼란에 불안과 리드입니다. (모두가 HTTPS를 사용하는 경우)하지만, 응용 프로그램은 저장하고 이상적 일 것이다 암호 같은 작은 titbits를 공유 전용 공유 Google 문서 도구에 저장하는 것은 나쁘지 않습니다.

    Heroku가에 환경 변수를 설정하는 방법

    당신에게 Heroku에서 단일 환경을 사용하는 경우 :

    -bash> heroku config:add HTTP_USER='herouser'
    -bash> heroku config:add HTTP_USER='heropass'
    

    당신은 Heroku가 여러 환경이있는 경우 :

    -bash> heroku config:add HTTP_USER='staguser' --remote staging
    -bash> heroku config:add HTTP_PASS='stagpass' --remote staging
    
    -bash> heroku config:add HTTP_USER='produser' --remote production
    -bash> heroku config:add HTTP_PASS='prodpass' --remote production
    

    포먼과 .env의

    많은 개발자 (서버를 아파치 / 승객의 좋아하는 사용에 반대 또는 레일로) 로컬 앱을 실행합니다 (Heroku가 툴 벨트와 함께 설치) 감독을 사용합니다. Heroku가 로컬 디바이스의 전환은 그런 측면에서 원활한는 그래서 명령, 응용 프로그램에서 실행되는 것을 선언 포먼과 Heroku가 사용 Procfile. 이 편리 큰 그래서 나는 모든 레일 프로젝트에 포먼과 Heroku가를 사용합니다. 그러나 여기에 일이 .. 포먼 부하 환경 변수가 /.env를 통해 dotenv에 저장하지만 불행히도 필수적으로 키 = 값 쌍의 파일을 구문 분석 dotenv입니다; 이미 설정된 변수 (일 건조한 상태로 유지하기 위해)를 참조 할 수 있도록 그 쌍, 변수 바로 다음이되지 않습니다 없으며에서 "루비"를 할 수 있습니다합니다 (조건문과 위에서 언급 한 바와 같이)하는 당신이 할 수있는 /config/app_environment_variables.rb에서 할. 예를 들어, 일을 유지하는 측면에서 가끔 이런 식으로 물건을 할 DRY :

    ENV['SUPPORT_EMAIL']='Company Support <support@company.com>'
    ENV['MAILER_DEFAULT_FROM'] = ENV['SUPPORT_EMAIL']
    ENV['MAILER_DEFAULT_TO']   = ENV['SUPPORT_EMAIL']
    

    따라서, 나는 로컬 내 응용 프로그램을 실행하는 데 포어를 사용하지만 로딩 환경 변수에 대한 .env의 파일을 사용하지 않습니다 오히려 I는 전술 /config/app_environment_variables.rb 접근법과 함께 포어를 사용한다.

  3. ==============================

    3.방법은 내가 실제로 작동하는 내 질문에 이렇게 노력하고 있어요!

    방법은 내가 실제로 작동하는 내 질문에 이렇게 노력하고 있어요!

    # environment/development.rb
    
    ENV['admin_password'] = "secret" 
    

    난 그냥 서버를 다시 시작했다. 나는 다시로드를 실행하는 생각! 레일 콘솔은 충분하다 그러나 나는 또한 웹 서버를 다시 시작했다.

    나는 이것이 넣고 ENV 변수를 설정하는 더 나은 장소입니다 느끼기 때문에 나는 내 자신의 대답을 따기입니다

  4. ==============================

    4.특정 개발 서버를 사용하는 경우 제쳐두고 여기에 솔루션으로, 청소기 대안이있다.

    특정 개발 서버를 사용하는 경우 제쳐두고 여기에 솔루션으로, 청소기 대안이있다.

    Heroku가의 감독으로, 당신은 .env의 파일 당 프로젝트 환경 변수를 만들 수 있습니다 :

    ADMIN_PASSOWRD="secret"
    

    탕으로, 당신은 .powenv 파일을 사용할 수 있습니다 :

    export ADMIN_PASSOWRD="secret"
    
  5. ==============================

    5.나는 가장 좋은 방법은 몇 가지 YML 파일에 저장 한 후 intializer 파일에이 명령을 사용하여 해당 파일을로드하는 것입니다 생각

    나는 가장 좋은 방법은 몇 가지 YML 파일에 저장 한 후 intializer 파일에이 명령을 사용하여 해당 파일을로드하는 것입니다 생각

    APP_CONFIG = YAML.load_file("#{Rails.root}/config/CONFIG.yml")[Rails.env].to_hash
    

    당신은 쉽게 액세스 환경 설정 변수를 관련 수 있습니다.

    귀하의 YML 파일 키 값 구조 :

    development:
      app_key: 'abc'
      app_secret: 'abc'
    
    production:
      app_key: 'xyz'
      app_secret: 'ghq'
    
  6. ==============================

    6.시스템 환경과 레일 '환경은 여러 가지입니다. ENV는 레일 '환경에서 작동하자,하지만 당신이 원하는 것은 런타임 시스템의 환경을 변경하는 경우는 역 따옴표로 명령을 둘러싸고 있습니다.

    시스템 환경과 레일 '환경은 여러 가지입니다. ENV는 레일 '환경에서 작동하자,하지만 당신이 원하는 것은 런타임 시스템의 환경을 변경하는 경우는 역 따옴표로 명령을 둘러싸고 있습니다.

    # ruby code
    `export admin_password="secret"`
    # more ruby code
    
  7. ==============================

    7.사용자 정의 .env의 파일의 로딩을위한 스크립트 : (가) 라인을 필요로하고, Application.initialize 라인 사이 /config/environment.rb에 다음 줄을 추가합니다 :

    사용자 정의 .env의 파일의 로딩을위한 스크립트 : (가) 라인을 필요로하고, Application.initialize 라인 사이 /config/environment.rb에 다음 줄을 추가합니다 :

    # Load the app's custom environment variables here, so that they are loaded before environments/*.rb
    
    app_environment_variables = File.join(Rails.root, 'config', 'local_environment.env')
    if File.exists?(app_environment_variables)
      lines = File.readlines(app_environment_variables)
      lines.each do |line|
        line.chomp!
        next if line.empty? or line[0] == '#'
        parts = line.partition '='
        raise "Wrong line: #{line} in #{app_environment_variables}" if parts.last.empty?
        ENV[parts.first] = parts.last
      end
    end
    

    그리고 설정 / local_environment.env처럼 보일 것이다 (당신은 그것을 .gitignore 할 것) :

    # This is ignored comment
    DATABASE_URL=mysql2://user:psw@0.0.0:3307/database
    RACK_ENV=development
    

    (@ user664833 용액 기준)

  8. from https://stackoverflow.com/questions/4911607/is-it-possible-to-set-env-variables-for-rails-development-environment-in-my-code by cc-by-sa and MIT license