【问题标题】:How can I call Rake methods from a module如何从模块中调用 Rake 方法
【发布时间】:2015-09-07 15:37:35
【问题描述】:

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

有没有一种简单的方法来调用像这样放在顶层的函数?

【问题讨论】:

    标签: ruby rake rake-task rakefile


    【解决方案1】:

    当您定义一个模块时,该模块中的代码具有一个新的范围。

    因此,RakeUtilityFunctions 中的directory 与顶级代码的范围不同。

    由于您尚未在 RakeUtilityFunctions 中定义 directory,您会收到未定义的方法错误。

    查看this article 的Scope Gate 部分。

    【讨论】:

    • 感谢@ReggieB 的回复。在您的帮助下,我发现了另一个关于类似问题的问题,请参阅我的答案。
    【解决方案2】:

    我现在想通了。在@ReggieB 的帮助下,我发现了这个问题:ways to define a global method in ruby

    它包含来自 rake 更改日志的摘录。

    如果您需要在类中调用“task :xzy”,请将 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
    }
    

    【讨论】:

      猜你喜欢
      • 2015-12-19
      • 2014-09-21
      • 2012-06-04
      • 2015-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-10
      • 2020-11-06
      相关资源
      最近更新 更多