是否可以在rake任务中包含一个模块而不会污染全局范围?

Dmi*_*nko 3 ruby rake rake-task

我想知道 - 是否有可能为rake任务创建私有帮助器,无论我如何尝试它们,它们最终都可以在全局范围内使用,并且可以作为任何对象的方法使用.例如:

## this is what I need

module MyRakeHelpers
  def helper_1
  end

  def helper_2
  end
end

include RakeHelpers

task :sometask do
  helper_1
  helper_2
end

## And this should not work:

# global scope
helper_1

"a random object".helper_1

class RandomClass
  def foo
    helper_1
  end
end
Run Code Online (Sandbox Code Playgroud)

Max*_*ace 5

这对我有用:

module MyRakeHelpers
  def helper
    puts 'foo'
  end
end

module MyRakeTasks
  extend Rake::DSL
  extend MyRakeHelpers

  task :some_task do
    helper
  end
end
Run Code Online (Sandbox Code Playgroud)

简而言之,您可以通过包含(或扩展)在不同的范围内使用Rake DSL Rake::DSL.从来源:

DSL是一个提供#task,#desc,#namedspace等的模块.当你想在顶级范围之外使用rake时使用它.对于从命令行运行的Rakefile,将自动包含此模块.

taskRake::Task#define_task在引擎盖下使用,您也可以使用它来编写自己的DSL.

感谢如何构建自定义佣金任务; 正确的方式为在末端define_task.