mixin可用于减少Rake文件中的冗余吗?

时间:2013-02-20 23:03:45

标签: ruby rake mixins

我有一个带有5个不同命名空间的Rakefile,每个命名空间都有相同的6个方法签名。每个签名的主体完全相同。它们的区别仅在于方法使用的实例变量的值。

一个具体的例子:

namespace :db do
  namespace :foo do
    @user = "foo"
    task :create do
      function_call_to_do_stuff @user
    end
  end

  namespace :bar do
    @user = "bar"
    task :create do
      function_call_to_do_stuff @user
    end
  end
end

理想情况下,我希望能够做到这样的事情:

module Migratable
  task :create do
    function_call_to_do_stuff @user
  end
end

namespace :db do
  namespace :foo do
    include Migratable
    @user = "foo"
  end

  namespace :bar do
    include Migratable
    @user = "bar"
  end
end

当我执行上面显示的操作时,mixin中的任务不会注册为适当命名空间的任务 - 或者根本就是任务。有没有办法实现这个目标?

1 个答案:

答案 0 :(得分:1)

Rake只是Ruby,因此您可以根据需要使用包含和扩展的模块。

也就是说,有一种更简单的方法来实现你想要的东西:让你的模块只是简单的Ruby。

示例:

# migratable.rb
module Migratable
  def create x
    puts x
  end
end


# rakefile.rb
require_relative 'migratable'
include Migratable

namespace :db do

  task :foo do
    @user = "foo"
    create(@user)
  end

  task :bar do
    @user = "bar"
    create(@user)
  end

end

在Rake中,您应该设置可能在任务中覆盖的实例变量,而不是在命名空间内。这是因为在任务运行之前,所有名称空间都被解析。