복붙노트

[RUBY-ON-RAILS] 어떻게 레이크 작업에 RAILS_ENV를 강요하는 걸까?

RUBY-ON-RAILS

어떻게 레이크 작업에 RAILS_ENV를 강요하는 걸까?

나는이 작은 레이크 작업이 :

namespace :db do 
  namespace :test do 
    task :reset do 
      ENV['RAILS_ENV'] = "test" 
      Rake::Task['db:drop'].invoke
      Rake::Task['db:create'].invoke
      Rake::Task['db:migrate'].invoke
    end
  end
end

내가 실행할 때 지금, 그것은 RAILS_ENV 내가 하드 코드로 시도 무시합니다. 예상대로 나는이 작업을 작업을 어떻게해야합니까

해결법

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

    1.이 특정 작업을 위해, 당신은 단지 아담 지적 그래서, 당신은이 작업을 수행 할 수 있으며, DB 연결을 변경해야합니다 :

    이 특정 작업을 위해, 당신은 단지 아담 지적 그래서, 당신은이 작업을 수행 할 수 있으며, DB 연결을 변경해야합니다 :

    namespace :db do 
      namespace :test do 
        task :reset do 
          ActiveRecord::Base.establish_connection('test')
          Rake::Task['db:drop'].invoke
          Rake::Task['db:create'].invoke
          Rake::Task['db:migrate'].invoke
          ActiveRecord::Base.establish_connection(ENV['RAILS_ENV'])  #Make sure you don't have side-effects!
        end
      end
    end
    

    당신의 작업이 더 복잡, 당신은 ENV의 다른 측면을해야 할 경우, 당신은 새로운 레이크 프로세스를 생성 안전한 있습니다 :

    namespace :db do 
      namespace :test do 
        task :reset do 
          system("rake db:drop RAILS_ENV=test")
          system("rake db:create RAILS_ENV=test")
          system("rake db:migrate RAILS_ENV=test")
        end
      end
    end
    

    또는

    namespace :db do 
      namespace :test do 
        task :reset do 
          if (ENV['RAILS_ENV'] == "test")
            Rake::Task['db:drop'].invoke
            Rake::Task['db:create'].invoke
            Rake::Task['db:migrate'].invoke
          else
            system("rake db:test:reset RAILS_ENV=test")
          end
        end
      end
    end
    
  2. ==============================

    2.레일 3, 당신은 사용해야합니다

    레일 3, 당신은 사용해야합니다

    Rails.env = "test"
    Rake::Task["db:drop"].invoke
    

    대신에

    RAILS_ENV = "test"
    Rake::Task["db:drop"].invoke 
    
  3. ==============================

    3.또 다른 옵션은 ENV를 확인하고 계속하기를 거부하는 것입니다 :

    또 다른 옵션은 ENV를 확인하고 계속하기를 거부하는 것입니다 :

    unless Rails.env.development?
      puts "This task can only be run in development environment"
      exit
    end
    

    또는 정말 계속할 것인지 물어 :

    unless Rails.env.development?
      puts "You are using #{Rails.env} environment, are you sure? y/n"
      continue = STDIN.gets.chomp
      exit unless continue == 'y'
    end
    
  4. ==============================

    4.깨끗하고 간단한 솔루션 RAILS_ENV 다시 정의하는 것 (ENV를하지 [ 'RAILS_ENV'])

    깨끗하고 간단한 솔루션 RAILS_ENV 다시 정의하는 것 (ENV를하지 [ 'RAILS_ENV'])

    namespace :db do
      namespace :test do  
        task :reset do 
          RAILS_ENV = "test" 
          Rake::Task['db:drop'].invoke
          Rake::Task['db:create'].invoke
          Rake::Task['db:migrate'].invoke
        end
      end
    end
    

    다음과 같이 레일 응용 프로그램의 부팅 과정에서 RAILS_ENV 초기화됩니다

    RAILS_ENV = (ENV['RAILS_ENV'] || 'development').dup unless defined?(RAILS_ENV)
    

    레일 코드의 나머지 부분은 직접 RAILS_ENV를 사용합니다.

    마이클은 그의 대답에 코멘트에 지적 그러나, 즉석에서 RAILS_ENV 전환하는 것은 위험 할 수 있습니다. 또 다른 방법은 데이터베이스 연결을 전환하는 것,이 솔루션은 사실의 기본 DB에서 사용되는 : 테스트 작업을

    ActiveRecord::Base.establish_connection(:test)
    
  5. ==============================

    5.물론 가장 좋은 방법은 당신이 레이크 작업을 실행 명령 줄에서 환경을 지정하는 것입니다,하지만 당신이 원하는 게 아니에요 어떤 이유로, 당신은이 작업을 수행 할 수 있습니다 :

    물론 가장 좋은 방법은 당신이 레이크 작업을 실행 명령 줄에서 환경을 지정하는 것입니다,하지만 당신이 원하는 게 아니에요 어떤 이유로, 당신은이 작업을 수행 할 수 있습니다 :

    ENV["RAILS_ENV"] = 'test'
    RAILS_ENV.replace('test') if defined?(RAILS_ENV)
    
    load "#{RAILS_ROOT}/config/environment.rb"
    

    그리고 그 트릭을 할해야합니다.

  6. ==============================

    6.database_tasks.rb에서 이상한 코드가있다 :

    database_tasks.rb에서 이상한 코드가있다 :

      def each_current_configuration(environment)
        environments = [environment]
        environments << 'test' if environment == 'development'
    
        configurations = ActiveRecord::Base.configurations.values_at(*environments)
        configurations.compact.each do |configuration|
          yield configuration unless configuration['database'].blank?
        end
      end
    

    ENV 개발의 경우 항상 테스트를 추가합니다. 동시 개발 및 첫 번째 개발을 실행하여 테스트 및 테스트 초 동안 작업을 다시 : 나는 정의 DB를 수행하고자하는 경우를 해결했다. 또한, 작업을 실행하기 전에, 내가 액티브 :: 작업을 설정해야합니다 내 set_env 방법 :: DatabaseTasks.env이없는 전화, 데이터베이스 연결은 예상대로 환경에 몰래 처리하지 못하는 것 같습니다. 나는 분리 등의 다른 모든 종류의 시도했지만이 추가 코드없이 일했다.

    def set_env(env)
      Rails.env = env.to_s
      ENV['RAILS_ENV'] = env.to_s
      ActiveRecord::Tasks::DatabaseTasks.env = env.to_s
    end
    

    재 구축 및 DB : 다음은 동시 다중 환경 데시벨 내 전체 db.rake 파일의 요점은 잘라야

  7. from https://stackoverflow.com/questions/1090176/how-do-i-force-rails-env-in-a-rake-task by cc-by-sa and MIT license