我在一个正在研究的项目中使用rakes运行了许多解析器。当使用另一个rake中已存在的方法名称,并且因为它们都使用相同的环境时,我会发生冲突。
有没有办法限制其命名空间中rake文件的范围?我认为那是名称空间的全部内容吗?
示例:
namespace :test do
task :test_task => :environment do
...
end
def test_method(argument)
...
end
end
namespace :other_test do
task :test_task => :environment do
...
end
def test_method(argument, argument2)
...
end
end
在这种情况下,当运行rake test:test_task
时,我将收到无效数量的参数错误。另一方面,如果我在任务本身内定义方法,我必须按顺序将方法保留在rake文件的顶部。这有点令人困惑和丑陋。
这只是一种必要的邪恶吗?
谢谢!
答案 0 :(得分:8)
我认为rake任务的命名空间与文件系统中的目录服务的目的相同:它们是关于组织而不是封装。这就是为什么数据库任务在db:
,rails:
中的Rails任务等等。
Rake名称空间不是类,因此当您在Rake名称空间中定义时,您需要问自己要添加test_method
的类。答案是对象。因此,当您执行第二个任务时,Object已经有一个test_method
方法,它接受一个参数,Ruby正确地抱怨。
最好的解决方案是让你的Rake任务非常薄(就像控制器一样),并将某些支持方法(例如test_method
)关闭到某个库文件中。 Rake任务通常应该只进行一些设置,然后调用库方法来完成实际工作(即与控制器相同的总体布局)。
执行摘要:将所有实际工作和繁重工作放在库文件中的某个位置,并使您的Rake任务成为库的瘦包装器。这应该通过正确的代码组织使您的问题消失。
答案 1 :(得分:0)
visibility: visible|hidden|collapse|initial|inherit;
在任何定义之前, module Anonymous
namespace :test do
# brabra
end
end
self.class.send(:remove_const, :Anonymous)
module Anonymous
namespace :another_test do
# brabra
end
end
self.class.send(:remove_const, :Anonymous)
块需要您Module.new do end
。为避免这种情况,您需要命名模块并将其删除。
答案 2 :(得分:0)
我找到了一种方法来命名Rake任务中的方法,因此同名的方法不会发生冲突。
extend Rake::DSL
self.
)。我已经测试了这个,它仍然允许一个rake任务调用或依赖于另一个模块中的另一个rake任务。
示例:
module Test
extend Rake::DSL
namespace :test do
task :test_task => :environment do
...
end
def self.test_method(argument)
...
end
end
end
module OtherTest
extend Rake::DSL
namespace :other_test do
task :test_task => :environment do
...
end
def self.test_method(argument, argument2)
...
end
end
end