我的rake文件中有很多实用程序函数,其中一些创建了rake任务。我想将这些实用程序函数移动到一个模块中以避免名称冲突,但是当我这样做时,rake方法不再可用。
require 'rake'
directory 'exampledir1'
module RakeUtilityFunctions
module_function
def createdirtask dirname
directory dirname
end
end
['test1', 'test2', 'test3'].each { |dirname|
RakeUtilityFunctions::createdirtask dirname
}
我得到的错误是:
$ rake
rake aborted!
undefined method `directory' for RakeUtilityFunctions:Module
C:/dev/rakefile.rb:8:in `createdirtask'
C:/dev/rakefile.rb:13:in `block in <top (required)>'
C:/dev/rakefile.rb:12:in `each'
C:/dev/rakefile.rb:12:in `<top (required)>'
据我所知,目录方法由Rake中的following code置于ruby顶层:
# Extend the main object with the DSL commands. This allows top-level
# calls to task, etc. to work from a Rakefile without polluting the
# object inheritance tree.
self.extend Rake::DSL
是否有一种简单的调用函数方式,就像这样放在顶层?
答案 0 :(得分:1)
定义模块时,该模块中的代码具有新范围。
因此,RakeUtilityFunctions中的directory
与顶级代码的范围不同。
由于您尚未在RakeUtilityFunctions中定义directory
,因此会出现未定义的方法错误。
查看this article的范围之门部分。
答案 1 :(得分:1)
我现在已经弄明白了。在@ReggieB的帮助下,我发现了这个问题:ways to define a global method in ruby。
它包含了rake change log的摘录。
如果您需要致电任务:xzy&#39;在课堂上,将Rake :: DSL包含在课堂中。
因此,最简单的方法是使用Rake :: DSL扩展模块:
require 'rake'
directory 'exampledir1'
module RakeUtilityFunctions
self.extend Rake::DSL ### This line fixes the problem!
module_function
def createdirtask dirname
directory dirname
end
end
['test1', 'test2', 'test3'].each { |dirname|
RakeUtilityFunctions.createdirtask dirname
}