2014-10-22 4 views
1

환경 변수를 설정하는 방법은 윤곽이 그려진 것 같습니다. here. 즉db : migrate : 재설정이 환경 변수와 함께 작동하지 않습니다.

는 내가 설정/app_env_vars.rb 파일을 만든 넣어 :

unless Rails.env.production? 
    ENV['DB_PASSWORD'] = 'password' 
    ENV['DB_USERNAME'] = 'username' 
end 
puts 'ECHO app_env_vars.rb' 

를 설정에서/environment.rb에를 내가 넣어 :

app_env_vars = File.join(Rails.root, 'config', 'app_env_vars.rb') 
load(app_env_vars) if File.exists?(app_env_vars) 

puts "ECHO environment.rb" 

바로

에서 Rails.application.initialize! 전에 database.yml :

development: 
    adapter: postgresql 
    encoding: unicode 
    database: my_app_development 
    host: localhost 
    pool: 5 
    password: <%= ENV['DB_PASSWORD'] %> 

test: 
    adapter: postgresql 
    encoding: unicode 
    database: my_app_test 
    host: localhost 
    pool: 5 
    password: <%= ENV['DB_PASSWORD'] %> 

나는 그런 bundle exec rake db:migratebundle exec rake db:reset 잘 작동하지만 bundle exec rake db:migrate:reset을 실행할 때 표시 실패 등의 작업 실행 : 나는 번들 간부 갈퀴 DB를 실행하면 일반적으로

fe_sendauth: no password supplied 
. 
. 
. 
Couldn't drop my_app_development 
fe_sendauth: no password supplied 
. 
. 
. 
Couldn't drop my_app_test 
fe_sendauth: no password supplied 
ECHO app_env_vars.rb 
ECHO environment.rb 

: 마이그레이션 (및 DB : 드롭)를 먼저 것이다 ECHO 파트를 표시 한 다음 작업을 수행하고 로그를 저장하십시오. 그러나 db : migrate : reset의 경우 태스크가 끝날 때까지 환경 변수를 초기화하지 않습니다.

database.yml에서 env 변수가 아닌 실제 암호를 넣으면 db : migrate : reset이 문제없이 작동합니다. 여기

는 레이크 dB이다 db:reset ** Execute environment 일부의 경우

** Invoke db:reset (first_time) 
** Invoke environment (first_time) 
** Execute environment 
ECHO app_env_vars.rb 
ECHO environment.rb 
** Invoke db:load_config (first_time) 
** Execute db:load_config 
** Execute db:reset 
** Invoke db:drop (first_time) 
** Invoke db:load_config 
** Execute db:drop 
** Invoke db:setup (first_time) 
** Invoke db:schema:load_if_ruby (first_time) 
** Invoke db:create (first_time) 
** Invoke db:load_config 
** Execute db:create 
** Invoke environment 
** Execute db:schema:load_if_ruby 
** Invoke db:schema:load (first_time) 
** Invoke environment 
** Invoke db:load_config 
** Execute db:schema:load 
-- enable_extension("plpgsql") 
    -> 0.0772s 
-- create_table("users", {:force=>true}) 
    -> 0.0795s 
-- add_index("users", ["email"], {:name=>"index_users_on_email", :unique=>true, :using=>:btree}) 
    -> 0.0406s 
-- initialize_schema_migrations_table() 
    -> 0.0829s 
** Invoke db:structure:load_if_sql (first_time) 
** Invoke db:create 
** Invoke environment 
** Execute db:structure:load_if_sql 
** Invoke db:seed (first_time) 
** Execute db:seed 
** Invoke db:abort_if_pending_migrations (first_time) 
** Invoke environment 
** Execute db:abort_if_pending_migrations 
** Execute db:setup 

재설정 : 마이그레이션 :

여기
** Invoke db:migrate:reset (first_time) 
** Invoke db:drop (first_time) 
** Invoke db:load_config (first_time) 
** Execute db:load_config 
** Execute db:drop 
fe_sendauth: no password supplied 
. 
. # gem trace stuff... 
. 
Couldn't drop my_app_development 
fe_sendauth: no password supplied 
. 
. # gem trace stuff... 
. 
Couldn't drop my_app_test 
** Invoke db:create (first_time) 
** Invoke db:load_config 
** Execute db:create 
fe_sendauth: no password supplied 
. 
. # gem trace stuff... 
. 
Couldn't create database for {"adapter"=>"postgresql", "encoding"=>"unicode", "database"=>"my_app_development", "host"=>"localhost", "pool"=>5, "password"=>nil} 
fe_sendauth: no password supplied 
. 
. # gem trace stuff... 
. 
Couldn't create database for {"adapter"=>"postgresql", "encoding"=>"unicode", "database"=>"my_app_test", "host"=>"localhost", "pool"=>5, "password"=>nil} 
** Invoke db:migrate (first_time) 
** Invoke environment (first_time) 
** Execute environment 
ECHO app_env_vars.rb 
ECHO environment.rb 
** Invoke db:load_config 
** Execute db:migrate 
** Invoke db:_dump (first_time) 
** Execute db:_dump 
** Invoke db:schema:dump (first_time) 
** Invoke environment 
** Invoke db:load_config 
** Execute db:schema:dump 
** Execute db:migrate:reset 

는 레이크 DB 대한 --trace이다 --trace 옵션 재설정 어떤 실행 전에 완료되면 db:migrate:reset** Execute environment은 몇 번의 실행 후 수행됩니다.

+0

왜 application.yml을 사용하여 env 변수를 처리하지 않습니까? 그것은 상자에서 작동합니다. – socjopata

+0

application.rb를 원하셨습니까? 이후 application.yml을 찾을 수 없습니다. 나는 레일을 사용하고있다 4.1.6 내가 '좋은 습관'이라고 이해하고 또한 github에 업로드 할 때 다른 회원이 중요한 정보를 보지 못하도록하기 때문에이 방법을 사용한다. – 12init

+0

내 이해에서 env 변수는 응용 프로그램이 아니라 시스템 (os)에 정의되어 있습니다. 'DB_PASSWORD = 123 rake db : migrate' – lsaffie

답변

0

이 설정을 사용하는 이유는 무엇입니까? 활성 레코드가 레일 외부에서 사용될 수 있기 때문에 environment.rb 환경에서 파일에 env 변수를 설정하면 작동하지 않습니다. 따라서 모든 작업이 초기화 된 레일 환경에서 실행됩니다.

더 좋은 해결책은 모든 레이크 작업을로드 할 figaro 또는 dot-env과 같은 보석을 사용하는 것입니다. 그것이 확실하지 않은 그 보석으로 그것이 얼마나 정확하게되는지에 관해 안다. 그러나 만일 내가 그것에 들어가고, 내가 여기에 게시 할 것 인 것을 알면.

관련 문제