2011-06-23 13 views
8

Quiero escribir un script de Ruby algo como esto:¿Puedo escribir el código de Ruby que se ejecuta solo cuando se ejecuta mi secuencia de comandos, pero no cuando se requiere?

class Foo 
    # instance methods here 

    def self.run 
    foo = Foo.new 
    # do stuff here 
    end 
end 

# This code should only be executed when run as a script, but not when required into another file 
unless required_in? # <-- not a real Kernel method 
    Foo.run 
end 
# ------------------------------------------------------------------------------------------ 

Quiero ser capaz de unidad de prueba, lo cual es por eso que no quiero que el código fuera de la clase para funcionar a menos que yo ejecuto el secuencia de comandos directamente, es decir, ruby foo_it_up.rb.

Sé que puedo simplemente poner la clase Foo en otro archivo y require 'foo' en mi guión. De hecho, esa es probablemente una mejor manera de hacerlo, solo en caso de que la funcionalidad de Foo sea necesaria en otro lugar. Entonces mi pregunta es más académica que nada, pero aún estaría interesado en saber cómo hacer esto en Ruby.

+1

posible duplicado de [Ejecutar una biblioteca de Ruby desde la línea de comandos] (http://stackoverflow.com/questions/487086/run-a-ruby-library-from-the-command-line) - pero tomó algunos Google graves para encontrarlo! Me sorprende que esta pregunta no se haga con más frecuencia. –

+0

Andrew: Lo mismo aquí. ¡Esperaba encontrar la respuesta en Stack Overflow ya! Gracias por su ayuda de nuevo. –

Respuesta

20

Esto se hace generalmente con

if __FILE__ == $0 
    Foo.run 
end 

pero prefiero

if File.identical?(__FILE__, $0) 
    Foo.run 
end 

porque los programas como el rubí-prof can make $0 not equal__FILE__ incluso cuando se utilizan --replace-progname.

$0 se refiere al nombre del programa ($PROGRAM_NAME), mientras que __FILE__ es el nombre del archivo fuente actual.

+0

Muy directo. ¡Gracias! –

Cuestiones relacionadas