2013-02-20 106 views
1

我有一个带有5个不同名称空间的Rakefile,每个名称空间都有相同的6个方法签名。每个签名的身体完全一样。它们仅在方法使用的实例变量的值上有所不同。可以使用mixin来减少Rake文件中的冗余?

一个具体的例子:

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 

当我做如上所示,在混入的任务不要注册为适当命名空间的任务 - 或者作为任务来处理这个问题。有没有办法做到这一点?

回答

1

Rake仅仅是Ruby,所以你可以使用包含include和扩展的模块。

也就是说,有一种更简单的方法来实现你想要的:使你的模块只是普通的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 

在耙,你应该设置可能的任务中被覆盖,而不是内部的命名空间的实例变量。这是因为在任务运行之前,命名空间全部在之前被解析为

+0

是的,你写的最后一句话让我烧了一阵子。这仍然打开一个到重复任务名称的问题。但它解决了一些问题! – Mike 2013-02-21 06:36:18