2011-10-05 12 views
20

Bazı görevlerin adını takma gereği duyduğumda, bunu nasıl yapmalıyım? ÖrneğinRake'de görev adının diğer adı

, ben görev adını açmak nasıl:

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

için:

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

Düzenleme cevabını aldıktan sonra


:

İşte
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] 
] 

cevap

36

Neden bir takma adı gerekiyor? Herhangi bir kod olmadan yeni bir görev tanıtabilirsiniz, ancak orijinal görevinin bir önkoşuluyla.

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

Bu parametreler ile kombine edilebilir:

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 
Eğer arg_names parametreleri okuyabilirsiniz parametreler adlarını aramak için kaçınmak için:

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

bir define_alias_task bunu birleştirin - yöntemi:

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) 

Ruby 1.9.1 ve rake-0.8.7 ile test edilmiştir.

Hmmm, sanırım, birkaç saat önce neredeyse aynı solution RyanTM already posted.

+0

Bu yöntemi biliyorum, ancak parametreyi geçemiyor. – coolesting

+0

Yapabileceğinden eminim. Biraz bekleyin, bir örnek hazırlayacağım. – knut

+1

Örneğimi ekledim - ve zaten gönderilmiş olan cevap olduğunu tespit ettim. Ama belki de benim açıklamam anlamaya yardımcı olur (dürüst olmak gerekirse, ben aynı cevabı verene kadar Ryans cevabını anlamamıştım;) – knut

4

bazı kod yazmak için yazdı: 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 
İlgili konular