2011-12-09 5 views
4

Est-il possible d'aliaser un espace de noms dans Rake?Rake, espace de noms Alias ​​


J'aime la façon dont vous pouvez alias tâches:

task :commit => :c 

aimerait être en mesure de faire quelque chose comme ceci:

namespace :git => :g 
+0

Vous devez certainement accepter la réponse de Knut. – Jerska

Répondre

5

Avec

task :commit => :c 

vous n Ne définissez pas un alias, vous définissez un prérequis. Lorsque vous appelez :commit, le pré-site :c est appelé en premier. Tant qu'il n'y a qu'un seul pré-site et :commit ne contient pas de code propre, cela peut ressembler à un alias, mais ce n'est pas le cas.

Sachant que, vous pouvez 'alias votre espace de noms, si vous define a default task for your namespace et définir une condition préalable à cette tâche (et la condition sine qua non peut-être à nouveau une tâche par défaut d'un autre espace de noms).

Mais je pense, il n'y a pas besoin d'aliasing namespaces. Il suffirait, si vous définissez une tâche par défaut pour namepsaces et peut-être 'alias' cette tâche.


Après avoir lu la question que j'ai encore une idée alternative, basée sur 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 

La règle définit un task_missing et essaie de règle des remplacer l'espace de noms (dans l'exemple, il remplace 'short' avec 'long_namespace'). Inconvénient: une tâche non définie ne renvoie aucune erreur.

Donc, vous avez besoin d'une version adaptée:

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 

Et une version plus généralisée avec une nouvelle méthode aliasnamespace pour définir les alias-namespaces:

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

Exemple simple pour un "besoin" d'un alias d'espace de noms. J'utilise AR sans Rails, et je voulais recréer certaines commandes Rails comme des tâches Rake. Avoir 'rake generate: migration' et' rake g: migration' serait génial. – Jerska

+2

@Jerska Vous m'avez fait réfléchir à cette question: j'ai ajouté une 2ème réponse. – knut

+0

Wow, réponse vraiment génial! Merci ! Que ton nom soit honoré, que ton règne vienne bientôt, etc. – Jerska