rake命名空间与ruby模块

时间:2016-02-27 12:07:49

标签: ruby-on-rails ruby rake rake-task

如何在不同的rake任务中使用相同名称的辅助函数?以下代码不起作用:

# bar.rake
namespace :bar do

  desc 'bar'
  task :bar => :environment do
    bar
  end

  def bar
    puts "bar bar"
  end

end

# foo.rake
namespace :foo do

  desc 'bar'
  task :bar => :environment do
    bar
  end

  def bar
    puts "foo bar"
  end

end

(错误)结果是:

$ rake bar:bar
foo bar

那是因为rake的命名空间不像ruby的模块那样工作,所以第二个任务中的bar函数重新定义了第一个任务的bar函数。

那么在rake任务中使用本地帮助函数有什么好的解决方案呢?

3 个答案:

答案 0 :(得分:2)

您可以将整个定义包装在模块中,但需要使用Rake DSL扩展它:

# bar.rake
Module.new do
  extend Rake::DSL

  namespace :bar do

    desc 'bar'
    task :bar => :environment do
      bar
    end

    def self.bar
      puts "bar bar"
    end

  end

# foo.rake
Module.new do
  extend Rake::DSL

  namespace :foo do

    desc 'bar'
    task :bar => :environment do
      bar
    end

    def self.bar
      puts "foo bar"
    end

  end
end

答案 1 :(得分:2)

拥有本地帮助函数的另一种方法是使用本地辅助函数:)

namespace :bar do

  desc 'bar'
  task :bar => :environment do
    helper = -> {
      puts 'bar bar'
    }

    helper.call
  end

end

答案 2 :(得分:1)

更多的样式首选项,但通常我将使用静态方法创建namespace :bar do task :bar => :environment do StaticTask.fetch end end # OR namespace :foo do task :bar => :environment do idea = AnotherIdea.new idea.fetch end end 类(或者如果需要管理某个状态,则构建实例)并在rake任务中使用它们。这样,这些方法也很容易测试。在你的情况下:

require

我喜欢亲自关注的更多模式,但它创造了一个很好的分离任务之间的关注点。

(对于 con.Open(); OleDbCommand Cmd = new OleCommand("SELECT * FROM Article", con); DataSet Ds = new DataSet(); OleDbDataAdapter dscmd = new OleDbDataAdapter(Cmd); dscmd.Fill(Ds, "Article"); CrystalReport7 objRpt7 = new CrystalReport7(); objRpt7.SetDataSource(Ds); crystalReportViewer7.ReportSource = objRpt7; crystalReportViewer7.Refresh(); con.Close(); ,无论你带哪个班级,这都是至关重要的)