2011-12-09 15 views
4

Rakeの名前空間のエイリアスは可能ですか?Rake名前空間エイリアス

私はあなたが仕事を別名することができますどのように好き

task :commit => :c 

はこのような何かを行うことができるのが大好きだ:

task :commit => :c 

namespace :git => :g 
+0

あなたは間違いなく、クヌートの答えを受け入れる必要があります。 – Jerska

答えて

5

あなたはドンエイリアスを定義しない場合は、前提条件を設定します。 :commitに電話すると、前もって:cが呼び出されます。 プリキュアサイトが1つしかなく、:commitに独自のコードが含まれていない場合は、エイリアスのように見えますが、そうではありません。あなたdefine a default task for your namespace及び(および前提条件が再び別の名前空間のデフォルトの作業になる場合があります)、このタスクのための前提条件を設定した場合、あなたは「別名」あなたの名前空間かもしれない、ということを知っ

でも、ネームスペースのエイリアシングは必要ありません。ネームスペースのデフォルトタスクを定義し、おそらく 'エイリアス'というタスクを定義するだけで十分です。もう一度質問を読んだ後、私は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')。

短所:未定義のタスクはエラーを返しません。エイリアスの名前空間を定義するための新しい方法aliasnamespace

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 

そして、もっと一般的なバージョン:だから、適応バージョンが必要

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を使用しています.RakeタスクとしていくつかのRailsコマンドを再作成したかったのです。 'rake generate:migration'と' rake g:migration'を持つことは素晴らしいことです。 – Jerska

+2

@Jerskaあなたはこの質問のために再び私に考えさせました:私は2番目の答えを追加しました。 – knut

+0

うわー、本当に素晴らしい答え!ありがとう!あなたの名前が誉められ、あなたの王国がすぐに来るように! – Jerska