2011-12-09 136 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