是否可以在Rake中为命名空间添加别名?
我喜欢你可以为任务添加别名:
task :commit => :c
希望能够做到这样的事情:
namespace :git => :g
答案 0 :(得分:6)
用
task :commit => :c
如果没有定义别名,则设置先决条件。
当您致电:commit
时,会先调用prerequsite :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