2011-10-05 144 views
20

当我需要别名某个任务的名称时,我应该怎么做?Rake中的任务名称的别名

例如,我怎么把任务名称:

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

到:

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

编辑得到了答案后:

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] 
] 

回答

36

为什么你需要一个别名?您可以在没有任何代码的情况下引入新任务,但是具有原始任务的先决条件。

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

这可以用参数组合:

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 

为避免搜索参数的名称,你可以用arg_names读取参数:

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

它合并到define_alias_task - 方法:

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和rake-0.8.7测试。

嗯,嗯,我看到几乎在几小时前差不多完全相同solution RyanTM already posted

+0

我知道这个方法,但它不能传递参数。 – coolesting

+0

我很确定它可以。等几分钟,我会准备一个例子。 – knut

+1

我加了我的例子 - 并检测到它已经发布的答案。但也许我的解释有助于理解(说实话,我没有理解Ryans的答案,直到我做出相同的回答;) – knut

4

下面是一些代码有人写了这么做: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