Ich füge eine Rake-Aufgabe zum docker_manager-Plugin hinzu, stelle jedoch fest, dass die Aufgabe zweimal ausgeführt wird, wenn ich sie aufrufe. In ihrer einfachsten Form kann ich testing.rake zu lib/tasks mit folgendem Inhalt hinzufügen:
# frozen_string_literal: true
desc "Ein Test"
task "docker_manager:test" do
puts "test"
end
Mit diesem Ergebnis:
/var/www/discourse# rake docker_manager:test --trace
** Invoke docker_manager:test (first_time)
** Execute docker_manager:test
test
test
Ich habe bestätigt, dass dies kein allgemeines Problem mit Aufgaben in Plugins ist, indem ich dieselbe Rake-Datei zum poll-Plugin mit diesem Ergebnis hinzugefügt habe:
Ich konnte noch nichts Offensichtliches in den beiden Plugins finden, das dies verhindern/verursachen könnte. Daher hoffe ich, dass jemand Vorschläge machen kann, was dies in poll verhindern oder in docker_manager verursachen könnte.
OK, ich habe es geschafft, die Aufgabe auf nur zweimaliges Ausführen zu reduzieren, indem ich die Aufgabe aus dem Initialisierungsblock entfernt habe. Anscheinend reicht es aus, sie in /lib/tasks zu legen, ohne sie laden zu müssen.
Das hat mich auf 1 Wiederholung (jetzt insgesamt 2!) reduziert
Number of posts on this forum is 366
Number of posts on this forum is 366
Leider nicht. Anfangs ging ich davon aus, dass etwas im Kern dafür verantwortlich war, dass es zweimal geladen wurde, aber da es nur einmal ausgeführt wurde, wenn es zum Poll-Plugin hinzugefügt wurde, schien dies dem zu widersprechen.
Ich habe es inzwischen vergessen, aber ich glaube, die Verwendung von --trace könnte auch zeigen, dass es nur einmal geladen wird. Ich könnte mich irren, aber wenn ich mich richtig erinnere, werden die Zeilen invoke und/oder execute zweimal angezeigt, wenn es zweimal geladen wird.
Ich konnte keine Unterschiede zwischen docker_manager und poll oder irgendetwas im Kern finden, das diesen Unterschied im Verhalten erklären würde, und hatte im Grunde aufgegeben, als ich den Beitrag verfasst habe.
Ich stoße in einem neuen Plugin auf dasselbe Problem und habe ein wenig recherchiert. Es scheint, dass dieses Problem auch andere Plugins betrifft (z. B. das offizielle Chat-Plugin), aber ich habe eine funktionierende Lösung gefunden, um zu verhindern, dass die Aufgaben mehrmals registriert werden:
# Vorherige Registrierung löschen
task('import_json:preview').clear
# Aufgaben-Definition
desc 'Previews changes which would be applied by import_json'
task 'import_json:preview', [:file_path] => :environment do |_task, args|
puts "Hallo Welt!"
end
Das Löschen nach der Aufgabenbeschreibung verhindert, dass die Aufgabe mit rake --tasks aufgelistet wird, daher muss sie vorher gelöscht werden.
Bedeutet dies, dass Sie das gleiche Ergebnis erzielen, wenn Sie eine Aufgabe zu diesem hinzufügen, oder dass eine bereits vorhandene Aufgabe im Plugin dieses Verhalten aufweist?
Vielen Dank für die Informationen! Es fühlt sich ein wenig umständlich an, es löschen zu müssen, aber es ist sicherlich eine nützliche Übergangslösung.
Ich werde Ihren Beitrag zur einfacheren Orientierung für andere als Lösung markieren. Hoffentlich kann die allgemeinere Ursache noch identifiziert werden. Ich denke, die Frage lautet: Warum werden Aufgaben in einigen Plugins doppelt registriert und in anderen nicht?
Bedeutet das, dass Sie das gleiche Ergebnis erhalten, wenn Sie eine Aufgabe hinzufügen, oder dass eine bereits vorhandene Aufgabe im Plugin dieses Verhalten aufweist?
Während ich versuchte zu verstehen, warum die von mir in meinem eigenen Plugin entwickelten Aufgaben zweimal ausgeführt wurden, testete ich eine vorhandene Aufgabe im Chat-Plugin und sie wurde ebenfalls zweimal ausgeführt.
Ich habe auch einige Aufgaben aus anderen Plugins getestet, kann mich aber nicht mehr daran erinnern, welche. Einige wurden einmal ausgeführt, aber es gab nichts Offensichtliches an dem Unterschied in der Implementierung.
Vielleicht hat das etwas mit dem Autoloading zu tun?
In einem neuen Plugin enthält die Engine diese Zeile:
Wenn ich lib nicht lade, sondern lib/some_path, um das Laden von lib/tasks zu vermeiden, scheint es besser zu sein, aber der Nachteil ist, dass das Autoloading kaputt geht (ich habe hier aufgehört). Dies kann dazu führen, dass eine Reihe von require_relative-Anweisungen kompensieren müssen…
Es erscheint durchaus plausibel, dass, wenn es bereits einen Mechanismus zum Laden der Aufgaben gibt, diese möglicherweise ein zweites Mal geladen werden.
Ich frage mich, ob die Verwendung einer der folgenden Optionen damit umgehen würde (ich neige eher zu letzterer, da ich nicht weiß, welche Nebenwirkungen das einmalige Autoloading haben könnte):