С
task :commit => :c
вы не определяете псевдоним, вы устанавливаете предварительное условие.
Когда вы звоните :commit
, предварительный запрос :c
вызывается первым.
Пока существует только одно предварительное условие и :commit
не содержит собственного кода, оно может выглядеть как псевдоним , но это не так.
Зная это, вы можете ' псевдоним ' своего пространства имен, если вы определите задачу по умолчанию для вашего пространства имен и установите предварительное условие для этой задачи (и предварительное условие может снова задание по умолчанию для другого пространства имен).
Но я думаю, нет нужды совмещать пространства имен. Этого будет достаточно, если вы определите задачу по умолчанию для пространств имен и, возможно, ' alias ' эту задачу.
После прочтения вопроса у меня есть альтернативная идея, основанная на Существует ли «method_missing» для рейковых задач? :
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