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
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
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
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
@Jerska Vous m'avez fait réfléchir à cette question: j'ai ajouté une 2ème réponse. – knut
Wow, réponse vraiment génial! Merci ! Que ton nom soit honoré, que ton règne vienne bientôt, etc. – Jerska
Vous devez certainement accepter la réponse de Knut. – Jerska