Ausführen benutzerdefinierter Ruby-Skripte

Ich kann die Aufgaben, die ich erledigen möchte, über die Rails-Konsole erledigen. Diese Aufgaben müssen jedoch periodisch ausgeführt werden und ich möchte nicht jeden Befehl einzeln in die Rails-Konsole eingeben. Wie kann ich ein Ruby-Skript auf meiner selbst gehosteten Discourse-Instanz ausführen?

Zusätzlich wird das Skript eine CSV-Datei lesen. Wo soll ich diese CSV-Datei ablegen, damit sie innerhalb des Docker-Containers zugänglich ist und bei Updates nicht verschwindet?

Ein Ansatz ist, die Datei hochzuladen und dann die URL in einer Einstellung zu speichern. Das Hochladen einer Datei verhindert, dass sie gelöscht wird.

Sie können einen Job in einem Plugin ausführen lassen. Es gibt viele Beispiele für Jobs in Discourse- und Pavilion-Plugins.

1 „Gefällt mir“

Ich frage mich, ob mein Anwendungsfall einfacher ist, als ich anfangs erklärt habe. Ich mache normalerweise Folgendes:

./launcher enter app
rails c

> u= User.find(1)
> hier weiterer Code

Was ich tun möchte:

./launcher enter app
./my_code.rb

wobei my_code.rb die Inhalte dessen enthält, was ich zuvor in der Rails-Konsole ausgeführt habe.

Sie gaben an, dass „die Aufgaben periodisch ausgeführt werden sollen“.

Wenn dies „für die Lebensdauer der Community“ sein könnte, dann lohnt es sich, ein eigenes Plugin dafür zu schreiben. Es ist nicht viel schwieriger, als in die Rails-Konsole zu gehen (unordentlich und riskanter!).

Es wird Ihnen auch ermöglichen, den Code zu speichern und ordnungsgemäß zu verwalten und ihn im Laufe der Zeit zu verfeinern.

Alternativ könnten Sie eine Rake-Aufgabe definieren, aber Sie müssen diese irgendwo speichern, möglicherweise auch in einem Plugin!

2 „Gefällt mir“

[quote=“Robert, post:4, topic:236408, username:merefield”]Sie gaben an, dass „die Aufgaben periodisch ausgeführt werden sollen“.
[/quote]

Ja, das war eine schlechte Wortwahl. Was ich meinte war Folgendes: Ich muss diesen Job mehrmals im Laufe der Lebensdauer der Community ausführen. Es gibt jedoch keinen festen Zeitraum und wann er ausgeführt werden muss, wird durch ein externes Ereignis bestimmt. Ich werde die Aufgabe also mehrmals selbst ausführen, ohne regelmäßige Zeitabstände dazwischen.

Daher ist eine Rake-Aufgabe möglicherweise Ihre bevorzugte Lösung. Sie wurde speziell für die Ausführung von Ad-hoc-Skripten entwickelt. Ich würde sie trotzdem in ein Plugin einfügen, da Sie sie dann gut auf GitHub verwalten können und Sie nie vergessen, wo Sie sie abgelegt haben, oder sie versehentlich löschen.

Hier sind viele Beispiele: discourse/lib/tasks at 1472e47aae5bfdfb6fd9abfe89beb186c751f514 · discourse/discourse · GitHub

2 „Gefällt mir“

Sie könnten entweder eine Rake-Aufgabe daraus machen oder sie in einem Job ausführen, den Sie manuell von /sidekiq starten sollten.

Sie können entweder Ihre CSV-Datei über die UX hochladen und sie mit einem Einstellungswert übergeben, wie vorgeschlagen, oder sie in ein Thema hochladen und Ihr Skript den neuesten Beitrag/Upload im Thema abrufen lassen, oder sie nach /var/discourse/shared/standalone/xxx.csv hochladen und als /shared/xxx.csv im Skript darauf zugreifen. Oder vielleicht sollten Sie die gesamte Aufgabe über die API erledigen, anstatt eine CSV-Datei hochzuladen.

Sie beschreiben nicht, was Sie zu tun versuchen, sondern nur Ihre Lösung, die möglicherweise nicht die beste ist.