web-dev-qa-db-fra.com

Forcer la tâche de râteau à s'exécuter dans un environnement spécifique Rails

J'ai besoin d'exécuter une série de tâches Rake à partir d'une autre tâche Rake. Les trois premières tâches doivent être exécutées dans l'environnement de développement, mais la tâche finale doit être exécutée dans l'environnement de transfert. La tâche dépend de :environment ce qui provoque le chargement de l'environnement de développement Rails avant l'exécution des tâches).

Cependant, j'ai besoin que la tâche finale soit exécutée dans l'environnement de transfert.

Passer un Rails_ENV=staging L'indicateur avant d'appeler la tâche de râteau n'est pas bon car l'environnement a déjà été chargé à ce stade et tout cela ne fera que définir l'indicateur, pas charger l'environnement de transfert.

Existe-t-il un moyen de forcer une tâche de râteau dans un environnement spécifique?

25
Undistraction

J'ai déjà accompli ce genre de choses auparavant, mais pas de la manière la plus élégante:

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

Ça a toujours marché pour moi. Je serais curieux de savoir s'il y avait une meilleure façon.

19
kddeisz

La façon dont je l'ai résolu était d'ajouter une dépendance pour définir l'env Rails avant l'invocation de la tâche:

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