2011-05-30 14 views
7

Tengo un número de analizadores que corro con rastrillos en un proyecto en el que estoy trabajando. Cuando uso un nombre de método que ya existe en otro rake, y debido a que ambos usan el mismo entorno, aparece un conflicto.¿Alcance de rastrillos en un proyecto de rieles?

¿Hay alguna manera de limitar el alcance de los archivos de rake dentro de su espacio de nombres? Pensé que ese era el objetivo del espacio de nombres.

Ejemplo:

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 

En este caso, cuando se ejecuta rake test:test_task voy a recibir una cantidad no válida de error argumentos. Por otro lado, si defino el método dentro de la tarea en sí, tengo que mantener el método en la parte superior del archivo de rake en orden. Esto se pone un poco confuso y feo.

¿Es solo un mal necesario?

Gracias!

Respuesta

8

Veo que los espacios de nombres para las tareas de rake tienen el mismo propósito que los directorios en un sistema de archivos: se trata de organización en lugar de encapsulación. Es por eso que las tareas de bases de datos están en db:, rieles tareas en rails:, etc.

espacios de nombres Rake no son clases por lo que hay que preguntarse qué clase va a añadir a test_method cuando se define dentro de un espacio de nombres Rake. La respuesta es Object. Entonces, cuando tocas tu segunda tarea, Object ya tiene un método test_method que toma un parámetro y Ruby se queja con razón.

La mejor solución es hacer sus tareas de Rake muy finas (como los controladores) y poner cualquier método de soporte (como test_method) apagado en algún archivo de biblioteca en algún lugar sensato. Por lo general, una tarea de Rake debería simplemente hacer un poco de configuración y luego llamar a un método de biblioteca para hacer el trabajo real (es decir, el mismo diseño general que un controlador).

Resumen ejecutivo: ponga todo el trabajo real y trabajo pesado en algún lugar de los archivos de su biblioteca y haga que sus tareas Rake sean envoltorios delgados para sus bibliotecas. Esto debería hacer que su problema desaparezca mediante una organización de código adecuada.

+0

Seguimiento pregunta: http: // stackoverflow.com/questions/6183367/dynamic-namespace-rakes-and-parser-classes-with-rails –

+0

¿Has tenido la oportunidad de echarle un vistazo? –

0
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 bloque que necesita self:: antes de cualquier definición. Para evitar esto, debe nombrar el módulo y eliminarlo.

0

He descubierto una forma de espacio de nombres de los métodos en las tareas de Rake para que los métodos del mismo nombre no colisionen.

  1. Envuelva cada espacio de nombre externo en un módulo con nombre único.
  2. extend Rake::DSL
  3. Cambie sus métodos a métodos de clase (con self.).

He probado esto, y aún permite que una tarea de rake invoque o dependa de otra tarea de rake que se encuentre en un módulo diferente.

Ejemplo:

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 
Cuestiones relacionadas