ruby - rails - Rake: ¿cómo generar una lista de tareas desde dentro de una tarea?
tarea cron (3)
Me gustaría que mi: tarea predeterminada en un Rakefile sea un mensaje útil que también incluya la lista de tareas disponibles (la salida de rake -T) para las personas que no están tan familiarizadas con el rake.
¿Cómo invocas rake -T desde dentro de una tarea?
Esto es más complicado de lo que mucha gente necesita, pero este programa extraerá tareas de rake de otros archivos de rake SIN incluir esos otros rakefiles. Lo usé como parte de una tarea de rake que necesitaba validar otros rakefiles.
Clase principal
class RakeBrowser
attr_reader :tasks
attr_reader :variables
attr_reader :loads
@last_description = ''''
@namespace = ''''
include Rake::DSL
def desc(description)
@last_description = description
end
def namespace(name=nil, &block) # :doc:
old = @namespace
@namespace = "#{name}:#{@namespace}"
yield(block)
@namespace = old
end
def task(*args, &block)
if args.first.respond_to?(:id2name)
@tasks << "#{@namespace}" + args.first.id2name
elsif args.first.keys.first.respond_to?(:id2name)
@tasks << "#{@namespace}" + args.first.keys.first.id2name
end
end
def load(filename)
@loads << filename
end
def initialize(file)
@tasks = []
@loads = []
Dir.chdir(File.dirname(file)) do
eval(File.read(File.basename(file)))
end
@variables = Hash.new
instance_variables.each do |name|
@variables[name] = instance_variable_get(name)
end
end
end
Implementación
desc "Show all the tasks"
task :default do
browser = RakeBrowser.new(''common.rake'')
browser.tasks.each do |task|
puts " " + task
end
end
El código completo está en
No importa. Encontré la respuesta una vez que encontré el método correcto.
Además de llamar a display_tasks_and_comments, también debe configurar la expresión regular para filtrar las tareas que desea mostrar o, de forma predeterminada, las filtrará todas.
Para hacer que su tarea predeterminada sea la salida de rake -T use lo siguiente:
task :default do
Rake.application.options.show_task_pattern = //
Rake.application.display_tasks_and_comments()
end
Invocar rake -T
desde dentro de las tareas es un poco más complicado en las versiones más recientes de rake. Las opciones que deben configurarse pueden derivarse de rake/lib/application.rb
en el método standard_rake_options
. Básicamente esto se reduce a
Rake::TaskManager.record_task_metadata = true
task :default do
Rake::application.options.show_tasks = :tasks # this solves sidewaysmilk problem
Rake::application.options.show_task_pattern = //
Rake::application.display_tasks_and_comments
end
Tenga en cuenta que record_task_metadata
no se puede establecer dentro de la tarea predeterminada, ya que ya será demasiado tarde cuando se ejecute la tarea (las descripciones no se han recopilado, por lo tanto, son nulas y por lo tanto ninguna tarea coincide con el patrón). Intentar volver a cargar el archivo de Rake desde una tarea llevará a un bucle cerrado. Supongo que hay transacciones de rendimiento cuando siempre se recopilan metadatos. Si eso es un problema
task :default do
system("rake -sT") # s for silent
end
podría ser más adecuado.
Ambos trabajan para mí usando rake 0.9.2.2.