2011-10-05 8 views
20

Cuando necesito poner un alias para el nombre de alguna tarea, ¿cómo debo hacerlo?alias del nombre de la tarea en Rake

Por ejemplo, ¿Cómo se activa el nombre de la tarea:

rake db:table 
rake db:create 
rake db:schema 
rake db:migration 

a:

rake db:t 
rake db:c 
rake db:s 
rake db:m 

Edición después de recibir la respuesta:

def alias_task(tasks) 
    tasks.each do |new_name, old_name| 
     task new_name, [*Rake.application[old_name].arg_names] => [old_name] 
    end 
end 

alias_task [ 
    [:ds, :db_schema], 
    [:dc, :db_create], 
    [:dr, :db_remove] 
] 

Respuesta

36

¿Por qué necesita un alias? Puede introducir una nueva tarea sin ningún código, pero con un requisito previo para la tarea original.

namespace :db do 
    task :table do 
    puts "table" 
    end 
    #kind of alias 
    task :t => :table 
end 

Esto se puede combinar con los parámetros:

require 'rake' 
desc 'My original task' 
task :original_task, [:par1, :par2] do |t, args| 
    puts "#{t}: #{args.inspect}" 
end 

#Alias task. 
#Parameters are send to prerequisites, if the keys are identic. 
task :alias_task, [:par1, :par2] => :original_task 

Para evitar la búsqueda de los nombres de los parámetros que puede leer los parámetros con arg_names:

#You can get the parameters of the original 
task :alias_task2, *Rake.application[:original_task].arg_names, :needs => :original_task 

combinarlo con un define_alias_task - método:

def define_alias_task(alias_task, original) 
    desc "Alias #{original}" 
    task alias_task, *Rake.application[original].arg_names, :needs => original 
end 
define_alias_task(:alias_task3, :original_task) 

Probado con ruby ​​1.9.1 y rake-0.8.7.

Hmmm, bueno, veo que es más o menos exactamente lo mismo hace solution RyanTM already posted algunas horas.

+0

Conozco este método, pero no puede pasar el parámetro. – coolesting

+0

Estoy bastante seguro de que sí. Espere algunos minutos, prepararé un ejemplo. – knut

+1

Agregué mi ejemplo, y detecté que es la respuesta ya publicada. Pero tal vez mi explicación ayuda a entender (para ser honesto, yo no' entender respuesta Ryans hasta que hice la misma respuesta;) – knut

4

Aquí está algo código que alguien escribió para hacerlo: https://gist.github.com/232966

def alias_task(name, old_name) 
    t = Rake::Task[old_name] 
    desc t.full_comment if t.full_comment 
    task name, *t.arg_names do |_, args| 
    # values_at is broken on Rake::TaskArguments 
    args = t.arg_names.map { |a| args[a] } 
    t.invoke(args) 
    end 
end 
Cuestiones relacionadas