J’ajoute une tâche rake au plugin docker_manager mais je constate que la tâche s’exécute deux fois lorsque je l’invoque. Dans sa forme la plus simple, je peux ajouter testing.rake à lib/tasks avec le contenu suivant :
# frozen_string_literal: true
desc "Un test"
task "docker_manager:test" do
puts "test"
end
Avec ce résultat :
/var/www/discourse# rake docker_manager:test --trace
** Invoke docker_manager:test (first_time)
** Execute docker_manager:test
test
test
J’ai confirmé qu’il ne s’agit pas d’un problème général avec les tâches des plugins en ajoutant le même fichier rake au plugin poll avec ce résultat :
Je n’ai pas encore réussi à trouver quoi que ce soit d’évident dans les deux plugins qui pourrait empêcher/causer cela, j’espère donc que quelqu’un pourra proposer des suggestions sur ce qui pourrait empêcher cela dans poll ou causer cela dans docker_manager.
OK, j’ai réussi à réduire la tâche à seulement deux exécutions en retirant la tâche du bloc d’initialisation. Apparemment, il suffit de la placer dans /lib/tasks sans avoir à la charger.
Cela m’a ramené à 1 répétition (pour un total de 2 maintenant !)
Number of posts on this forum is 366
Number of posts on this forum is 366
Malheureusement non. Initialement, j’avais supposé que quelque chose dans le cœur du système le faisait charger deux fois, mais le fait qu’il ne s’exécute qu’une seule fois lorsqu’il est ajouté au plugin de sondage semblait réfuter cela.
J’ai un peu oublié maintenant, mais je pense que l’utilisation de --trace pourrait également montrer qu’il ne se charge qu’une seule fois. Je pourrais me tromper, mais si je me souviens bien, les lignes invoke et/ou execute apparaîtront deux fois s’il est chargé deux fois.
Je n’ai pas réussi à trouver de différences entre docker_manager et poll ou quoi que ce soit dans le cœur du système qui expliquerait cette différence de comportement, et j’avais pratiquement abandonné lorsque j’ai fait le post.
Je rencontre le même problème dans un nouveau plugin, et j’ai cherché un peu. Il semble que ce problème touche aussi d’autres plugins (par exemple : le plugin de chat officiel), mais j’ai trouvé une solution qui fonctionne pour éviter que les tâches ne soient enregistrées plusieurs fois :
# Effacer tout enregistrement précédent
task('import_json:preview').clear
# Définition de la tâche
desc 'Aperçu des modifications qui seraient appliquées par import_json'
task 'import_json:preview', [:file_path] => :environment do |_task, args|
puts "Bonjour le monde !"
end
Effacer après la description de la tâche empêchera la tâche d’être listée avec rake --tasks, elle doit donc être effacée avant.
Est-ce que cela signifie que vous obtenez le même résultat en y ajoutant une tâche ou qu’une tâche déjà existante dans le plugin a ce comportement ?
Merci pour l’information ! Cela semble un peu artisanal de devoir le vider, mais c’est certainement une solution de contournement utile.
Je vais marquer votre message comme solution pour la commodité des autres. J’espère que la cause plus large pourra toujours être identifiée, la question devenant : pourquoi les tâches sont-elles enregistrées deux fois dans certains plugins et pas dans d’autres ?
Est-ce que cela signifie que vous obtenez le même résultat en ajoutant une tâche ou qu’une tâche déjà existante dans le plugin a ce comportement ?
En essayant de comprendre pourquoi les tâches que j’ai développées dans mon propre plugin étaient exécutées deux fois, j’ai testé une tâche existante dans le plugin Chat et elle a également été exécutée deux fois.
J’ai testé aussi quelques tâches d’autres plugins mais je ne me souviens plus lesquelles. Certaines s’exécutaient une fois mais il n’y avait rien d’évident concernant la différence d’implémentation.
Peut-être y a-t-il quelque chose à voir avec l’autoloading ?
Sur un nouveau plugin, le moteur contient cette ligne :
Si je n’autoload pas lib mais lib/some_path pour éviter d’autoload lib/tasks, cela semble mieux, mais l’inconvénient est que cela casse l’autoloading (je me suis arrêté là). Ce qui peut conduire à avoir un tas d’instructions require_relative pour compenser…
Il semble certainement plausible que s’il existe déjà un mécanisme pour charger les tâches, cela puisse les faire charger une seconde fois.
Je me demande si l’utilisation de l’une des options suivantes permettrait de résoudre ce problème (je pencherais plutôt pour la seconde, car je ne connais pas les effets secondaires possibles d’un autoloading unique) :