web-dev-qa-db-ja.com

Rakeタスクを特定のRails環境で実行するように強制する

別のRakeタスクから一連のRakeタスクを実行する必要があります。最初の3つのタスクは開発環境で実行する必要がありますが、最後のタスクはステージング環境で実行する必要があります。タスクは:environmentに依存しているため、Rails開発環境がタスクの実行前にロードされます。

ただし、ステージング環境で実行する最後のタスクが必要です。

Rakeタスクを呼び出す前にRails_ENV=stagingフラグを渡すことは、環境がこの時点ですでにロードされており、ステージング環境をロードするのではなく、フラグを設定するだけなので、良くありません。

特定の環境でrakeタスクを強制する方法はありますか?

25
Undistraction

最もエレガントな方法ではありませんが、私は以前にこの種のことを達成しました。

task :prepare do
  system("bundle exec rake ... Rails_ENV=development")      
  system("bundle exec rake ... Rails_ENV=development")
  system("bundle exec rake ... Rails_ENV=test")
  system("bundle exec rake ... Rails_ENV=test")
  system("bundle exec rake ... Rails_ENV=test")
  system("bundle exec rake ... Rails_ENV=test")
end

それはいつも私のために働いています。もっと良い方法があるかどうか知りたいです。

19
kddeisz

私が解決した方法は、タスクが呼び出される前にRails envを設定する依存関係を追加することでした:

namespace :foo do
  desc "Our custom rake task"
  task :bar => ["db:test:set_test_env", :environment] do
      puts "Custom rake task"
      # Do whatever here...
      puts Rails.env
  end
end


namespace :db do
  namespace :test do
    desc "Custom dependency to set test environment"
    task :set_test_env do # Note that we don't load the :environment task dependency
      Rails.env = "test"
    end
  end
end 
14
Matt Schwartz