Tengo un Rakefile que compila el proyecto de dos maneras, de acuerdo con la variable global $build_type
, que puede ser :debug
o :release
(los resultados van en directorios separados):
task :build => [:some_other_tasks] do
end
Deseo crear una tarea que compile el proyecto con ambas configuraciones a su vez, algo como esto:
task :build_all do
[ :debug, :release ].each do |t|
$build_type = t
# call task :build with all the tasks it depends on (?)
end
end
¿Hay alguna manera de llamar a una tarea como si fuera un método? ¿O cómo puedo lograr algo similar?
Rake::Task["build"].invoke
puede ser mucho más eficaz que usarlosystem rake build
porque no tiene que crear un nuevo hilo y cargar el entorno Rails, lo quesystem rake build
sí tiene que hacer.Respuestas:
Si necesita que la tarea se comporte como un método, ¿qué tal usar un método real?
Si prefiere apegarse a
rake
las expresiones idiomáticas, aquí están sus posibilidades, compiladas a partir de respuestas pasadas:Esto siempre ejecuta la tarea, pero no ejecuta sus dependencias:
Éste ejecuta las dependencias, pero solo ejecuta la tarea si aún no se ha invocado:
Esto restablece primero el estado ya invocado de la tarea, permitiendo que la tarea se ejecute nuevamente, dependencias y todo:
Tenga en cuenta que las dependencias ya invocadas no se vuelven a ejecutar automáticamente a menos que se vuelvan a habilitar. En Rake> = 10.3.2, puede usar lo siguiente para volver a habilitarlos también:
fuente
Rake::Task['db:reset'].invoke
Rake::Task['with:args'].invoke("pizza")
ENV['VERSION'] = '20110408170816'; Rake::Task['db:migrate'].invoke
Vea aquí para más explicaciones.#reenable()
que no vuelve a habilitar los requisitos previos, y lo necesitaba. Esta adición a Rake (> = 10.3.2)#all_prerequisite_tasks()
iterará todas las tareas, incluidas las pre-req de pre-req. Entonces,Rake::Task[task].all_prerequisite_tasks.each &:reenable
rake db:reset db:migrate
de comandos )? ¿Puedes hacer algo como:Rake::Task["db:reset", "db:migrate"].invoke
por ejemplo:
fuente
Eso debería resolverlo, solo necesitaba lo mismo para mí.
fuente
fuente
fuente
Si desea que cada tarea se ejecute independientemente de cualquier falla, puede hacer algo como:
fuente
Sugeriría no crear tareas generales de depuración y liberación si el proyecto es realmente algo que se compila y resulta en archivos. Debería ir con las tareas de archivo, que es bastante factible en su ejemplo, como usted dice, que su salida va a diferentes directorios. Digamos que su proyecto solo compila un archivo test.c a / debug / test.out y out / release / test.out con gcc, podría configurar su proyecto así:
Esta configuración se puede usar como:
Esto hace un poco más de lo solicitado, pero muestra mis puntos:
fuente