强制 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 任务?