1

我有一个带有 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 中的任务不会注册为适当命名空间的任务 - 或者根本就不会注册为任务。有没有办法做到这一点?

4

1 回答 1

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 中,您应该设置可以在任务中覆盖的实例变量,而不是在命名空间中。这是因为命名空间都是在任务运行之前解析的。

于 2013-02-21T04:48:42.747 回答