Estoy agregando una tarea de rake al plugin docker_manager pero encuentro que la tarea se ejecuta dos veces cuando la invoco. En su forma más simple, puedo agregar testing.rake a lib/tasks con el siguiente contenido:
# frozen_string_literal: true
desc "Una prueba"
task "docker_manager:test" do
puts "prueba"
end
Aún no he podido encontrar nada obvio en los dos plugins que pueda estar previniendo/causando esto, así que espero que alguien pueda ofrecer sugerencias sobre lo que podría estar previniendo esto en poll o causándolo en docker_manager.
OK, logré reducir la tarea a solo dos ejecuciones al eliminar la tarea de ser cargada en el bloque de inicialización. Aparentemente, es suficiente con ponerla en /lib/tasks sin tener que cargarla.
Eso me ha reducido a 1 repetición (¡ahora a un total de 2!)
Number of posts on this forum is 366
Number of posts on this forum is 366
Lamentablemente no. Inicialmente asumí que era algo en el núcleo lo que causaba que se cargara dos veces, pero al ver que solo se ejecutaba una vez cuando se agregaba al plugin de encuestas, pareció refutar eso.
Lo he olvidado un poco ahora, pero creo que usar --trace también podría mostrar que solo se carga una vez. Puedo estar equivocado, pero si mal no recuerdo, las líneas invoke y/o execute aparecerán dos veces si se carga dos veces.
No pude encontrar ninguna diferencia entre docker_manager y poll ni nada en el núcleo que explicara esta diferencia de comportamiento, y básicamente me había rendido cuando hice la publicación.
Estoy encontrando el mismo problema en un nuevo plugin y he buscado un poco. Parece que este problema afecta a otros plugins también (por ejemplo: el plugin de chat oficial), pero he encontrado una solución que funciona para evitar que las tareas se registren varias veces:
# Borrar cualquier registro previo
task('import_json:preview').clear
# Definición de la tarea
desc 'Previsualiza los cambios que serían aplicados por import_json'
task 'import_json:preview', [:file_path] => :environment do |_task, args|
puts "¡Hola mundo!"
end
Borrar después de la descripción de la tarea evitará que la tarea se liste con rake --tasks, por lo que debe borrarse antes.
¿Significa esto que obtienes el mismo resultado al añadir una tarea a él o que una tarea ya existente en el plugin tiene este comportamiento?
¡Gracias por la información! Se siente un poco improvisado tener que borrarlo, pero sin duda es una solución útil.
Marcaré tu publicación como la solución para la comodidad de otros. Espero que la causa general aún pueda identificarse, supongo que la pregunta se convierte en: ¿por qué las tareas se registran dos veces en algunos plugins y no en otros?
¿Significa esto que obtienes el mismo resultado al agregar una tarea o que una tarea ya existente en el plugin tiene este comportamiento?
Mientras intentaba entender por qué las tareas que desarrollé en mi propio plugin se ejecutaban dos veces, probé una tarea existente en el plugin de Chat y también se ejecutó dos veces.
Probé algunas tareas de otros plugins también, pero no recuerdo cuáles. Algunas se ejecutaban una vez, pero no había nada obvio en la diferencia de implementación.
¿Quizás tiene algo que ver con la carga automática?
Si no cargo automáticamente lib, sino lib/some_path para evitar cargar automáticamente lib/tasks, parece mejor, pero la desventaja es que rompe la carga automática (me detuve aquí). Lo que puede llevar a tener un montón de sentencias require_relative para compensar…
Ciertamente parece plausible que si ya existe un mecanismo para cargar las tareas, esto podría hacer que se carguen por segunda vez.
Me pregunto si usar alguna de las siguientes opciones resolvería esto (creo que me inclinaría por la última, ya que no sé qué efectos secundarios podría tener cargar una vez automáticamente):