我的第一个解决方法是避免可能是文件名的符号名称。
例如。在您的情况下:task :do_tests 和 directory 'test'
缺点:如果不始终非常小心,将无法正常工作。
第二个是对符号任务使用特殊语法::@name
PRO:容易记住,不需要写太多。
现在我正在尝试一种 hack,自动执行 :@name - 事情。
class Object; def rakesym
self
end end
class Symbol; def rakesym
self.to_s.sub(/\A@?/,'@').to_sym
end end
module Rake::DSL
# transform symbol-tasks and -deps to :@XXXX
#
# args is always an array
# [ t ]
# [ t, p0 ] ---> t[p0]
# [ t, p0,p1 ] ---> t[p0,p1]
# [ {t => deps } ]
# [ t, { [prms] => deps } ]
# [ t, p0 => deps ] ---> ERROR
# [ t, p0,p1 => deps ] ---> ERROR
# [ t, {[] => deps}
# [ t, {[params] => deps} ]
#
# deps can be a single value or an array:
# deps:== d0 | [] | [d0] | [ d0,d1,.. ]
def hack_args( *args )
STDOUT.puts "=== args before: #{args.inspect}"
args[0] = args[0].rakesym
if (args[0].is_a? Hash) && (args[0].size == 1)
t,deps = args[0].first
args[0] = { t.rakesym => deps }
end
if (args[-1].is_a? Hash) && (args[-1].size == 1)
x, deps = args[-1].first
deps.map!{|d| d.rakesym } if deps.is_a? Array
args[-1][x] = deps.rakesym
end
STDOUT.puts "=== args after: #{args.inspect}"
return args
end
alias task_o task
def task(*args, &block )
task_o( *hack_args(*args), &block )
end
# ... same for 'file', 'file_create' and 'directory'
end # module Rake::DSL
现在这给出了两个不同的任务:
desc "create html/ directory"
directory 'html'
desc "compile HTML docs"
task :html => HTML_FILES
我可以从 shell 调用:
> rake -D
rake html
create html/ directory
rake @html
compile HTML docs
还是 TODO:
- 处理命名空间。
- 修补
defaul_task_name