强制 Rake 任务在特定的 Rails 环境中运行

Posted

技术标签:

【中文标题】强制 Rake 任务在特定的 Rails 环境中运行【英文标题】:Force Rake Task To Run in Specific Rails Environment 【发布时间】: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 登录,我可以清楚地看到这一点,它没有第二次加载。 您确定正在查看暂存环境的正确日志吗? 【参考方案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 加载的,在定义任务之前更不用说运行了。

以上是关于强制 Rake 任务在特定的 Rails 环境中运行的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Rails 中使用环境将参数传递给 Rake 任务? [复制]

rake db rake 任务不工作 Ruby 2.4.0 & Rails 5.0.1

如何在 ruby​​ on rails 的亚马逊 aws 服务器中使用 gem 执行 rake 任务?

在rals中将rake任务迁移到Lambda

在 rake 任务中使用 rails logger,rails 5

如何在 kubernetes cron 作业中启动 rails rake 任务