如何从模块调用Rake方法

时间:2015-09-07 15:37:35

标签: ruby rake rake-task rakefile

我的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

是否有一种简单的调用函数方式,就像这样放在顶层?

2 个答案:

答案 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
}