【问题标题】:A General Method to be invoked before every rake execution在每次 rake 执行之前调用的通用方法
【发布时间】:2016-11-23 06:38:33
【问题描述】:

在我的 Rails 项目(Rails 3.1、Ruby 1.9.3)中,定义了大约 40 个 rake 任务。要求是当我们启动每个 rake 时,我应该能够在数据库表中创建一个条目(rake 详细信息)。我需要的详细信息是rake name、arguments、start time 和end time。为此,我不希望使用代码更新 rake 文件。是否可以在 rake 文件的范围之外执行此操作。

任何帮助将不胜感激!

【问题讨论】:

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


【解决方案1】:

试试这个 https://github.com/guillermo/rake-hooks

For example in your Rakefile

require 'rake/hooks'

task :say_hello do
  puts "Good Morning !"
end

before :say_hello do
  puts "Hi !"
end

#For multiple tasks

namespace :greetings do 
  task :hola    do puts "Hola!" end ;
  task :bonjour do puts "Bonjour!" end ;
  task :gday    do puts "G'day!" end ;  
end 

before "greetings:hola", "greetings:bonjour", "greetings:gday" do
  puts "Hello!"
end

rake greetings:hola # => "Hello! Hola!"

【讨论】:

  • 它不能解决我的问题,我希望在没有我的 rake 任务的情况下在每次 rake 之前执行一个方法
  • 我们需要将我们的 rake 任务移动到一个命名空间中,并且在钩子刚刚调用你的方法之前。您不需要更新现有任务,但需要更新 rake 文件以添加命名空间和钩子之前。
  • 似乎没问题,但我的要求是,无论 lib/tasks 中的每个 rake 任务如何,都应该调用一个方法。如果添加了新的 rake 任务,则应调用此方法。但是这个钩子应该只对 rake 文件中提到的任务有效。主要目的是将 rake 任务名称、参数及其开始和结束时间记录到数据库表中。
【解决方案2】:

这似乎有点尴尬,但它可能对其他人有所帮助。

Rake.application.top_level_tasks

将返回一系列信息,包括 Rake 名称 及其参数。 下面附上参考资料。

pry(main)> a = Rake.application.top_level_tasks
=> ["import_data[client1,", "data.txt]"]

【讨论】:

  • 感谢您的信息
【解决方案3】:

当您创建 rake 任务时,您可以传递一个将在您的任务之前运行的父任务:

task my_task: :my_parent_task do
  # ...
end

如果您的任务依赖于多个任务,您可以传递一组父任务

task my_task: [:my_prev_task, :my_another_prev_task] do
  # ...
end

【讨论】:

  • 我不想更新我现有的 rake 任务。我需要的只是一个可以在每个任务之前调用的共同点
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多