2011-12-09 134 views
4

是否可以在Rake中命名空间?Rake命名空间别名


我怎么样,你可以别名任务:

task :commit => :c 

很想能够做到这样的事情:

namespace :git => :g 
+0

你一定要接受克努特的答案。 – Jerska

回答

5

随着

task :commit => :c 

你不不定义别名,你设置了一个先决条件。 当您致电:commit时,先要求先请求:c。 只要有一个prerequsite和:commit不包含自己的代码,它可能看起来像一个别名,但它不是。

知道了,你可“别名”命名空间,如果你define a default task for your namespace,并设置该任务的先决条件(和先决条件可能会再次另一个命名空间的默认任务)。

但我认为,没有必要使用别名命名空间。这足够了,如果你为namepsaces定义了一个默认任务,并且可能是'alias'那个任务。


再次读取的问题后,我有另外一个设想,基于Is there a “method_missing” for rake tasks?

require 'rake' 

namespace :long_namespace do 
    task :a do |tsk| 
    puts "inside #{tsk.name}" 
    end 
end 

rule "" do |tsk| 
    aliastask = tsk.name.sub(/short:/, 'long_namespace:') 
    Rake.application[aliastask].invoke 
end 

Rake.application['short:a'].invoke 

的规则定义task_missing -rule并试图更换命名空间(它取代的例子'short'和'long_namespace')。

缺点:未定义的任务不返回任何错误。所以,你需要一个改编版:

require 'rake' 

namespace :long_namespace do 
    task :a do |tsk| 
    puts "inside #{tsk.name}" 
    end 
end 

rule "" do |tsk| 
    aliastask = tsk.name.sub(/short:/, 'long_namespace:') 
    if Rake.application.tasks.map{|tsk| tsk.name }.include?(aliastask) 
    Rake.application[aliastask].invoke 
    else 
    raise RuntimeError, "Don't know how to build task '#{tsk.name}'" 
    end 
end 

Rake.application['short:a'].invoke 
Rake.application['short:undefined'].invoke 

,并用新方法aliasnamespace具备更好的通用定义别名命名空间:

require 'rake' 
#Extend rake by aliases for namespaces 
module Rake 
    ALIASNAMESPACES = {} 
end 
def aliasnamespace(alias_ns, original_ns) 
    Rake::ALIASNAMESPACES[alias_ns] = original_ns 
end 
rule "" do |tsk| 
    undefined = true 
    Rake::ALIASNAMESPACES.each{|aliasname, origin| 
    aliastask = tsk.name.sub(/#{aliasname}:/, "#{origin}:") 
    if Rake.application.tasks.map{|tsk| tsk.name }.include?(aliastask) 
     Rake.application[aliastask].invoke 
     undefined = false 
    end 
    } 
    raise RuntimeError, "Don't know how to build task '#{tsk.name}'" if undefined 
end 

#And now the usage: 
namespace :long_namespace do 
    task :a do |tsk| 
    puts "inside #{tsk.name}" 
    end 
end 
aliasnamespace :short, 'long_namespace' 

Rake.application['short:a'].invoke 
#~ Rake.application['short:undefined'].invoke 
+2

“需要”命名空间别名的简单示例。我使用的是没有Rails的AR,我想重新创建一些Rails命令作为Rake任务。有'耙生成:迁移'和'耙g:迁移'会很好。 – Jerska

+2

@Jerska你让我再次考虑这个问题:我添加了第二个答案。 – knut

+0

哇,真棒!谢谢 !祝愿你的名字得到尊重,你的王国即将来临,等等! – Jerska