Hallo zusammen,
Hat jemand reload <module> schon mal erfolgreich nutzen können?
Ein reload <module> erzeugt regelmässig im Logfile einträge in der Form
Subroutine module_Initialize redefined at ...
Geänderte Module-Files lassen sich so auch nicht aktivieren.
Was ja auch logisch ist, da ein erneutes laden des Modules dann doppelte globale Funktionsdeklarationen erzeugen würde.
Das gilt übrigens nicht nur für meine Module sondern beispielsweise auch für FS20 usw.
Hab ich die Verwendung von reload und die Beschreibung in der Commandref falsch verstanden?
ZitatReload the given module from the module directory. It is a convenient way to test modules whithout restarting the program.
Oder wo liegt mein Fehler?
Gruß
Dirk
die meldung ist eine warnung/hinweis und in diesem fall nicht wirklich ein fehler. es werden beim reaload ja tatsächlich die vorhandenen routinen überschreiben.
so lange ausser den redefined keine weiteren meldungen kommen wird das modul neu geladen, aktiviert und auch verwendet.
gruss
andre
Zitates werden beim reaload ja die vorhandenen routinen überschreiben.
Das ist das erwartete Verhalten. Und genau das passiert nicht. Meine Änderungen sind erst nach einem kompletten Restart sichtbar.
Daher die Frage.
Weitere Fehler kommen übrigens nicht.
Gruß
Dirk
was sind denn das konkret für änderungen die nicht sichtbar sind?
die neu geladenen routinen werden ja nicht alle direkt auch aufgerufen. _Initialize wird direkt aufgerufen aber wenn du z.b. an der DefFn etwas änderst hat das erst auswirkungen wenn du nach dem reload ein neues device dieses typs anlegst bzw. ein altes device mit modify änderst.
gruss
andre
Bei mir funktioniert das mit dem Modul-reload auch problemlos. NIcht vergessen: der Reload führt kein vollständiges rereadcfg durch, dadurch kann es schonmal zu Irritationen kommen.
Zitatdie neu geladenen routinen werden ja nicht alle direkt auch aufgerufen.
Das ist Klar
Zitat_Initialize wird direkt aufgerufen aber wenn du z.b. an der DefFn etwas änderst hat das erst auswirkungen wenn du nach dem reload ein neues device dieses typs anlegst bzw. ein altes device mit modify änderst.
Und nun wird mir ahc einiges klar. Danke für den Hinweis
Ich habe auch mit externen Modulen gearbeit die u.a. in FHEM/lib/... liegen
Diese werden natürlich nicht neu geladen.
reload FHEM/lib/... funktioniert so auch nicht, da die / in CommandReload ersetzt werden. Und es wird dann immer versucht dort die Initialize Funktion aufzurufen. Somit kann reload ausschließlich für "echte" FHEM-Module funktionieren.
Ich reloade jetzt meine Module-Files während der Entwicklung ggf. innerhalb der Initialize-Sub im entsprechenden Modul, damit klappt das erst mal. Ggf. überlege ich mir mal einen Patch mit dem man auch files unter FHEM/lib reloaden kann.
Gruß
Dirk
was den pfad angeh ist vermulich wirklich ein patch nötig.
ansonsten habe ich mir in meine files einfach eine _Initialize() funktion mit rein geschrieben. die kann ja auch leer sein. dann funktioniert das reload beim entwickeln auch mit hilfs files.
gruss
andre
Zitatansonsten habe ich mir in meine files einfach eine _Initialize() funktion mit rein geschrieben. die kann ja auch leer sein. dann funktioniert das reload beim entwickeln auch mit hilfs files.
Ja, mit der kleinen Einschränkung dass man seine Helper-Module keinen Namespace verpassen darf. Denn Initialize möchte CommandReload im main Kontext ausführen. Was in meinem Fall natürlich nicht klappt. Dafür hätte ich auch gerne einen Lösung.
Mein aktueller Vorschlag währ reload einen weiteren optionalen Parameter zu spendieren mit dem man eine alternative Initialize-Sub angeben kann.
Gruß
Dirk