Plugin-Rake-Task läuft mehrmals – was übersehen wir?

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:

/var/www/discourse# mv plugins/docker_manager/lib/tasks/testing.rake plugins/poll/lib/tasks/
/var/www/discourse# rake docker_manager:test --trace
** Invoke docker_manager:test (first_time)
** Execute docker_manager:test
test

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.

3 „Gefällt mir“

Hast du das gelöst?

Ich habe ein ähnliches Problem:

Wenn ich eine Rake-Aufgabe in einem Plugin erstelle, z. B.: lib/tasks/test.rake

mit Inhalt

desc "count posts"
task "test_rake:test" => :environment do
  puts "Number of posts on this forum is #{Post.count}"
end

und ausführe: rake test_rake:test

ist die Ausgabe für mich überraschend:

Number of posts on this forum is 366
Number of posts on this forum is 366
Number of posts on this forum is 366

Ich mache hier sicher einen Fehler, bin mir aber nicht sicher, welchen?

Warum wird das mehr als einmal ausgeführt und wie kann ich das stoppen?

Ich habe ein ähnliches Problem in der Produktion, was natürlich ein ernsteres Problem darstellt.

2 „Gefällt mir“

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 :sweat_smile:

Number of posts on this forum is 366
Number of posts on this forum is 366

Dies wiederholt nur die Erfahrung des OP.

2 „Gefällt mir“

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.

1 „Gefällt mir“

Ich bin vielleicht etwas spät dran :slight_smile:

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.

3 „Gefällt mir“

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:

config.autoload_paths << File.join(config.root, "lib")

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…

2 „Gefällt mir“

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):

config.autoload_once_paths << File.join(config.root, "lib")
config.autoload_lib(ignore: %w( tasks ))

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.