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
internastasks/*.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.