铁轨项目中的耙子范围?

在我正在研究的项目中,我有很多使用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文件的顶部。 这有点令人困惑和丑陋。

那只是一个必要的邪恶吗?

谢谢!

我认为rake任务的命名空间与文件系统中的目录服务的目的相同:它们是关于组织而不是封装。 这就是为什么数据库任务在db: ,rails中的Rails任务rails:等等。

Rake命名空间不是类,因此您需要问自己在Rake命名空间中定义时,您正在添加test_method类。 答案是对象。 因此,当您执行第二个任务时,Object已经有一个test_method方法,它接受一个参数,Ruby正确地抱怨。

最好的解决方案是让你的Rake任务非常薄(就像控制器一样),并将某些支持方法(例如test_method )放在某个库文件的某个地方。 Rake任务通常应该只进行一些设置,然后调用库方法来完成实际工作(即与控制器相同的总体布局)。

执行摘要:将所有实际工作和繁重工作放在库文件中的某个位置,并使您的Rake任务成为库的薄包装器。 这应该通过适当的代码组织使您的问题消失。

 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 block需要你self::在任何定义之前。 为避免这种情况,您需要命名模块并将其删除。

我已经找到了一种方法来命名Rake任务中的方法,因此同名的方法不会发生冲突。

  1. 将每个外部命名空间包装在一个唯一命名的模块中。
  2. extend Rake::DSL
  3. 将您的方法更改为类方法(使用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