我有一个带有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中的任务不会注册为适当命名空间的任务 - 或者根本就是任务。有没有办法实现这个目标?
答案 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中,您应该设置可能在任务中覆盖的实例变量,而不是在命名空间内。这是因为在任务运行之前,所有名称空间都被解析。