versiones son rails que las instalar gems gemas actualizar ruby-on-rails ruby rake task

ruby on rails - son - Ruby: Accediendo a la tarea de rake desde una gema sin Rails



rvm install rails (2)

Soy consciente de que las tareas de Rake se pueden definir en varios lugares dentro de una gema de Ruby:

  • dentro de un rakefile
  • tasks/*.rake internas tasks/*.rake
  • dentro de lib/tasks/*.rake

He leído que los dos primeros deben usarse cuando las tareas se ejecuten en la propia gema. Parece que la tercera opción debería elegirse cuando se desea que las tareas estén disponibles públicamente.

Hay muchos tutoriales en línea que muestran una variedad de métodos para cargar tareas de Rake desde una gema utilizando Rails, a saber, utilizando Rails::RailTie .

Sin embargo, me gustaría encontrar una forma de utilizar las tareas de una gema de dependencia dentro de otra gema sin necesidad de Rails.

¿Hay una solución simple para esto? ¿Alguien sería lo suficientemente amable como para describir el enfoque adecuado o delinear qué enfoques serían viables?

ACTUALIZAR

He intentado crear un archivo bin/my-gem para que esté disponible en el sistema para ejecutar tareas Rake desde my-gem . He puesto lo siguiente dentro;

#!/usr/bin/env ruby require ''rubygems'' require ''rake'' task=ARGV[0] spec = Gem::Specification.find_by_name(''dsi_core'') Dir["#{spec.gem_dir}/lib/tasks/*.rake"].each {|file| puts file and Rake::load_rakefile(file)} Rake::Task.clear # Avoid tasks being loaded several times in dev mode Rake::Task[task].reenable # Support re-execution of a task. Rake::Task[task].invoke

Parte del contenido se basó en esta publicación SO .

Lamentablemente, estoy haciendo algo mal porque al instalar la gema y luego ejecutar my-gem mytask con mytask definido en lib/test.rake se lib/test.rake lo siguiente:

/var/lib/gems/1.8/gems/rake-0.9.2/lib/rake/task_manager.rb:49:in `[]'': Don''t know how to build task ''mytest'' (RuntimeError) from /var/lib/gems/1.8/gems/rake-0.9.2/lib/rake/task.rb:298:in `[]'' from /var/lib/gems/1.8/gems/my_gem-0.0.1/bin/my_gem:8 from /usr/local/bin/my_gem:19:in `load'' from /usr/local/bin/my_gem:19


Encontré el cuerpo de la solución here . Lo modifiqué para admitir la especificación de tareas con argumentos y he agregado soporte para cucumber .

Asi que..

Dentro de tu gema crea bin/my_gem

Pegue el script al final de esta publicación en él. Ver comentarios para uso de ejemplo.

Tus tareas de rake deben estar en tu Rakefile .

Alternativamente, agregue sus tareas, por ejemplo, a lib/tasks/*.rake luego agregue lo siguiente en su Rakefile :

Dir.glob(''lib/tasks/*.rake'').each {|r| import r}

Aquí está la salsa secreta:

#!/usr/bin/env ruby # Run rake tasks and cucumber features # from my_gem once it''s installed. # # Example: # # my_gem rake some-task # my_gem rake some-task[args] # my_gem cucumber feature1 feature2 # # Note: cucumber features have ''.feature'' appended automatically, # no need for you to do it ;) # # Author:: N David Brown gem_dir = File.expand_path("..",File.dirname(__FILE__)) $LOAD_PATH.unshift gem_dir# Look in gem directory for resources first. exec_type = ARGV[0] if exec_type == ''rake'' then require ''rake'' require ''pp'' pwd=Dir.pwd Dir.chdir(gem_dir) # We''ll load rakefile from the gem''s dir. Rake.application.init Rake.application.load_rakefile Dir.chdir(pwd) # Revert to original pwd for any path args passed to task. Rake.application.invoke_task(ARGV[1]) elsif exec_type == ''cucumber'' then require ''cucumber'' features = ARGV[1,].map{|feature| "#{gem_dir}/features/#{feature}.feature"}.join('' '') runtime = Cucumber::Runtime.new runtime.load_programming_language(''rb'') pwd=Dir.pwd Dir.chdir(gem_dir) # We''ll load features from the gem''s dir. Cucumber::Cli::Main.new([features]).execute!(runtime) Dir.chdir(pwd) # Revert to original pwd for convenience. end

¡Bingo! :-)


Este post me dio algunos consejos, pero tal vez para otros que se topan con esto, tuve problemas con algunos problemas de dependencia. Finalmente resolví cómo hacer esto con un bin / binstub y sin requerir un rakefile. Mi solución está publicada en otra pregunta SO.