Hallo, ihr Discourse-Plugin-Experten,
nur eine kurze Frage zu Discourse-Plugins und Rails-Initialisierern.
Wenn ein Discourse-Plugin ein Verzeichnis namens „config
Hallo, ihr Discourse-Plugin-Experten,
nur eine kurze Frage zu Discourse-Plugins und Rails-Initialisierern.
Wenn ein Discourse-Plugin ein Verzeichnis namens „config
Ich möchte auch wissen, wie sich ein Discourse-Plugin von einem gewöhnlichen Rails-Engine unterscheidet. Ich habe mir zwar den Quellcode angesehen, aber nicht viel verstanden.
Nach einem flüchtigen Blick auf Ruby on Rails Guides: Configuring Rails Applications bin ich der Meinung, dass plugin.rb im Grunde dasselbe ist. Die meisten Plugins von nennenswerter Größe nutzen es als Einstiegspunkt für die Logik, nicht als die Logik selbst.
Ja, ich habe diesen Rails-Guide in letzter Zeit häufig gelesen. Grundsätzlich bin ich mit der Funktionsweise der Rails 6-Konfiguration „zufrieden
[quote=“neounix, Beitrag: 4, Thema: 168373”]
Ich frage mich nur, ob wir dieselbe Struktur in einem Discourse-Plugin (für Initializer) verwenden können, ob Rails die Initializer in den Unterverzeichnissen wie in Rails 6 liest; oder ob wir das Initializer-Verzeichnis des Plugins als Konfigurations-„Asset
Das sehe ich auch so.
Du lädst alle zusätzlichen benötigten Ruby-Dateien innerhalb von plugin.rb.
Hier ist ein Beispiel aus dem Follow-Plugin:
Das entspricht auch meinem Eindruck, nachdem ich eine Reihe von Discourse-Plugins auf GitHub gelesen habe.
Es scheint, dass Discourse nur plugin.rb liest und wir alle anderen Ruby-Dateien, die wir benötigen – etwa Initializer – in plugin.rb laden müssen.
Ich hatte jedoch gehofft, dass ich mich irre und es eine „tiefere
[quote=“neounix, Beitrag: 7, Thema: 168373”]
Ich hatte jedoch gehofft, dass ich mich irre und es eine „tiefere
Ja, das ist kein Problem, die Initialisierer in plugin.rb aufzurufen und zu laden.
Der Grund für meine Frage war, dass ich derzeit eine ziemlich große Rails 6-Anwendung für ein Unternehmen schreibe, bei der ich ihre veralteten Backoffice-Skripte (über mehrere Jahrzehnte) in eine Rails-Anwendung umwandle. Um Initialisierer hinzuzufügen, habe ich einfach ein Unterverzeichnis unter config/initializers (in Rails), und alle meine Initialisierer-Dateien werden so schön eingebunden, ohne dass ich Code schreiben muss, um diese Dateien in Rails einzuschließen.
Danke für alle eure Antworten. Das wird sehr geschätzt!
Ja, ich würde es toll finden, wenn die Rails-Vorteile auf Discourse-Plugins übertragen würden. Einer meiner persönlichen Favoriten wäre die Möglichkeit, Ruby-Dateien live neu zu laden, ohne den Server neu zu starten.
Dafür ist reloadable_patch gedacht. Wenn du Änderungen an Ruby-Klassen in reloadable_patch einschließt, sollten sie live neu geladen werden!
Kann ich die gesamte plugin.rb-Datei dafür im Dev-Modus einpacken? Ernster gefragt: Wie weit können wir damit gehen?
Außerdem: Das Hinzufügen neuer Dateien oder das Ändern von YAML-Dateien erfordert einen Server-Neustart, oder?
Du solltest nicht für alles ein reloadable_patch anwenden müssen. Viele der in instance.rb definierten Methoden, die die Plugin-Entwicklung erleichtern, verwenden intern reloadable_patch, wie zum Beispiel add_to_serializer.
Idealerweise ist unsere Plugin-API so gut gestaltet, dass du nicht eine wahnsinnige Menge an reloadable_patch-Aufrufen vornehmen musst.
Ja, das stimmt. Ich frage mich, ob man etwas gegen die Änderungen an YAML-Dateien unternehmen kann; das stört mich persönlich.
Das ist absolut richtig. Ich wusste nicht, dass reloadable_patch dazu gedacht ist, das Live-Reloading zu unterstützen. Mir fallen viele Anwendungsfälle ein, bei denen Discourse es bereits verwendet, aber auch darüber hinaus. Zum Beispiel:
reloadable_patch do
require 'x/y/z'
end
or Monkey-Patches.
Ich denke, das Entfernen oder Hinzufügen einer solchen Funktion wäre immer noch problematisch, da reloadable_patch innerhalb der Funktion aufgerufen wird.
In jedem Fall hilft das sehr.
Ich habe mich mit dem Live-Reload von YAML-Änderungen beschäftigt, und das funktioniert tatsächlich. Plugins können dieses Live-Reload unterbrechen, wenn sie reloadable_patch nicht ordnungsgemäß verwenden. Sobald jedoch alle Ihre Plugins sicher neu geladen werden können, werden auch Ihre YAML-Änderungen neu geladen.
Es wäre jedoch super hilfreich, wenn du die genauen Schritte zur Verwendung von reloadable_patch beschreiben könntest.
Hier ist mein Versuch, der leider nicht funktioniert hat (mir fehlt sicher etwas):
after_initialize do
add_to_serializer(:topic_view, :check, false) do
puts 'nocheck'
end
end
Sobald der Server startet und ich nocheck in check ändere, wird nach dem Neuladen der Topic-Route immer noch nocheck ausgegeben.
after_initialize do
reloadable_patch do |plugin|
puts 'nocheck'
end
end
Auch beim Neuladen einer beliebigen Seite nach dem Ändern des Strings unter puts habe ich immer noch keinen Erfolg.
Ich vermute, ich habe Sie in den obigen Beiträgen irreführende Informationen gegeben. reloadable_patch ist hilfreich für die Discourse-Entwicklung, aber @david hat die Verwendung sehr gut erklärt:
Alles, was sich im after_initialize-Block von plugin.rb befindet, wird nur während des Starts der Anwendung geladen, nicht jedoch bei nachfolgenden Neuladungen.
Angenommen, Sie möchten dem User-Serializer etwas hinzufügen. Das normale Verhalten wäre dann wie folgt:
Beim Start:
user_serializer.rbplugin.rb, das eine Überschreibung für user_serializer enthältBeim Neuladen:
user_serializer.rb neuMit unserem reloadable_patch-System:
Beim Start:
user_serializer.rbplugin.rb und registriert den reloadable_patch für den User-SerializerBeim Neuladen:
user_serializer.rb neuHier wird eine grundlegende Eigenschaft von Rails beschrieben, die für Discourse nicht direkt relevant ist.
In Rails werden alle Initialisierer nur beim Start von Rails geladen. Daher wird Code, der von einem Initialisierer wie „after_initializer
Ja genau! Das ist korrekt, und dein Verständnis von Rails-Initialisierern ist ebenfalls richtig.
Ich bin ebenfalls ein großer Rails-Fan ![]()