【问题标题】:Force Rake Task To Run in Specific Rails Environment强制 Rake 任务在特定的 Rails 环境中运行
【发布时间】:2014-02-28 12:41:12
【问题描述】:

我需要从另一个 Rake 任务运行一系列 Rake 任务。前三个任务需要在开发环境中运行,但最后一个任务需要在暂存环境中运行。该任务依赖于:environment,这会导致在任务运行之前加载 Rails 开发环境。

但是,我需要在暂存环境中执行最终任务。

在调用 rake 任务之前传递 RAILS_ENV=staging 标志是不好的,因为此时环境已经加载,所有这一切都会设置标志,而不是加载暂存环境。

有没有办法在特定环境中强制执行 rake 任务?

【问题讨论】:

  • 你可能不能,因为环境设置是全局的。您可以通过单独的系统调用来完成,例如system({RAILS_ENV: 'staging'}, "rake staging_command")
  • @LeonidShevtsov 我实际上在使用system,但它不会重新加载环境。
  • “重新加载环境”是什么意思?它确实会与整个应用程序一起重新加载 Ruby 解释器。还有什么应该重新加载?
  • 我的意思是在 rake 任务运行之前没有加载 Rails 应用程序的新实例。通过从application.rb 登录,我可以清楚地看到这一点,它没有第二次加载。
  • 您确定正在查看暂存环境的正确日志吗?

标签: ruby-on-rails ruby ruby-on-rails-3 rake


【解决方案1】:

我以前也做过这样的事情,虽然不是最优雅的方式:

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

它一直对我有用。我很想知道是否有更好的方法。

【讨论】:

  • 我无法使用上述 Matt Schwartz 的解决方案,因为我被困在 Ruby 1.8.7/Rails 2.2.2 上。实际上,这个解决方案效果很好。丑陋但简单。谢谢!
【解决方案2】:

我解决它的方法是在调用任务之前添加一个依赖项来设置 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 

【讨论】:

  • 嗨,我如何从控制器调用任务:set_test_env?
  • 在 Rails 4 中,这是行不通的。主配置是从 Rakefile 加载的,在定义任务之前更不用说运行了。
猜你喜欢
  • 2016-02-13
  • 2015-03-10
  • 2012-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-13
  • 1970-01-01
相关资源
最近更新 更多