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

时间:2016-06-20 16:26:50

标签: 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

3 个答案:

答案 0 :(得分:5)

这对我有用:

AF_VSOCK

简而言之,您可以通过包含(或扩展)module MyRakeHelpers def helper puts 'foo' end end module MyRakeTasks extend Rake::DSL extend MyRakeHelpers task :some_task do helper end end 来使用不同范围的Rake DSL。来自source

  

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

Rake::DSL使用了task,您也可以使用它来编写自己的DSL。

感谢How To Build Custom Rake Tasks; The Right Way提供关于Rake::Task#define_task的提示。

答案 1 :(得分:1)

我认为你可以像这样编写你的佣金任务:

module MyRakeHelpers
  def helper_1
  end

  def helper_2
  end
end

task :sometask do
  include RakeHelpers
  helper_1
  helper_2
end   

答案 2 :(得分:1)

First anwser: 这是你在找什么?

module MyRakeHelpers
  def self.helper_1
    puts 'helper_1'
  end

  def self.helper_2
    puts 'helper_2'
  end
end

task :sometask do
  MyRakeHelpers.helper_1
  MyRakeHelpers.helper_2
end

第二个回答: 我唯一能想到的就是这样的事情

module MyRakeHelpers
  def helper_1
    puts 'helper_1'
  end

  def helper_2
    puts 'helper_2'
  end
end

task :sometask do |t|
  t.extend MyRakeHelpers
  t.helper_1
end

但是你必须在任何地方加上