Wie lade ich Raku-Module zur Laufzeit für Debug-Zwecke neu?

8

Ich lade Module dynamisch in meine Raku Rest / API-Anwendung.

Ich möchte vermeiden, dass der Server jedes Mal neu gestartet wird, wenn ich Änderungen an meinen Modulen vornehme.

Gibt es eine Möglichkeit, die Raku-Module bei jedem Anruf neu zu laden?

try require ::('Foo');
David Romero
quelle

Antworten:

6

Cro macht das . Sie können Ihren Server auf Cro aufbauen, das würde ich empfehlen. Alternativ können Sie den Cro-Code studieren, um zu erfahren, wie er mit automatischen Neustarts umgeht. Cro :: Tools :: Runner wäre ein guter Ausgangspunkt.

Holli
quelle
4

Sie müssen berücksichtigen, dass alle Module vor dem Laden vorkompiliert werden. Was Sie laden, ist nicht die Quelle, sondern die daraus generierte CompUnit , die sich standardmäßig in einem .precompVerzeichnis befindet. Diese Vorkompilierung kümmert sich zum Beispiel auch um Versionen, aber die Hauptsache ist, dass es sich um Bytecode handelt, nicht um die Quelle.

Es gibt keine einfache Problemumgehung, außer diese Maschinerie in die Hand zu nehmen (dh zu überprüfen, ob Änderungen an der Quelle vorliegen, sie vorkompilieren, die vorkompilierten Binärdateien laden, wo immer sie sich befinden, und sie auszuführen), also denke ich, dass dies der Fall ist In diesem Fall ist es besser, sich zu fragen, ob es wirklich einen Anwendungsfall dafür gibt. Möglicherweise müssen Sie den Neustart des Servers beschleunigen, möglicherweise durch Automatisierung mithilfe von Sake , oder Integrationstests von einem Git-Hook aus ausführen, ohne den Server neu starten zu müssen

jjmerelo
quelle
3

Sie können ein Modul in einem Prozess nicht neu laden. Wenn eine Modulidentität nachgeschlagen wird, wird sie zwischengespeichert. Wenn Sie diese Identität ein zweites Mal nachschlagen, wird weiterhin die CompUnit verwendet, die beim ersten Mal übereinstimmt. Die Vorkompilierung hat darauf keinen Einfluss.

Sehen:

https://github.com/rakudo/rakudo/blob/0b8ede6c459be752adef9cbbf7b59c961d9df0b0/src/core.c/CompUnit/Repository/Installation.pm6#L445-L453

https://github.com/rakudo/rakudo/blob/0b8ede6c459be752adef9cbbf7b59c961d9df0b0/src/core.c/CompUnit/Repository/FileSystem.pm6#L13-L21

ugexe
quelle