PowerShell-Modul-Manifest - automatisches laden der Benötigten Module
Erstelle ich ein Modul, das hängt von mehreren anderen Module, die ich brauche laden in der globalen Umwelt. Ich habe versucht, erstellen ein Drehbuch und mit ScriptsToProcess-import der Module, aber es sieht aus wie der check für RequiredModules passiert, bevor ScriptstoProcess läuft.
Ist es eine nette, saubere Art und Weise in einem modulmanifest für beides Benötigen Sie ein Modul, und laden Sie es automatisch, wenn es nicht bereits geladen ist? Wenn das Modul nicht geladen werden konnte, dann die RequiredModule würde einen Fehler auslösen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
In der PowerShell 3 RequiredModules - sind automatisch geladen
Es ist auch der einzige Weg, um sicherzustellen, dass Menschen mit PowerShellGet (d.h. die PowerShell Gallery) installieren, Abhängigkeiten, wenn Sie gehen, um zu vertreiben das Modul.
Wäre es immer noch scheitern, wenn die erforderlichen Module fehlen, aber sonst funktioniert genau so, wie würden Sie es wünschen.
In PowerShell 2 gibt es keine Möglichkeit, automatisch zu laden RequiredModules -
In jedem Fall, Benutzer können manuell laden Sie die Anforderungen durch Eingabe
Import-Module RequiredModule, YourModule
--, die Sie nicht bekommen eine zweite Instanz, wenn es schon importiert ...Können Sie auch angeben, das Modul "NestedModules" statt. Auch in der PowerShell 2, werden diese geladen "innen" - Modul, aber nicht scheinen negative Auswirkungen auf Ressourcen, wenn Sie bereits geladen ist. Allerdings, wie @JasonMArcher erinnerte mich, in der PowerShell 2, NestedModules ausgeladen zusammen mit Ihrem Modul wenn das Modul entladen wird (über den Entfernen-Modul), und dies geschieht auch wenn Sie vorher separat geladen durch die Benutzer, die am Ende kann die Herstellung wirklich komische bug-reports, da Ihre Nutzer nicht erwarten, dass.
Die andere option, , die funktioniert in allen Versionen der PowerShell, ist der Aufruf
Import-Module
an der Oberseite des Moduls (in psm1 Skript, nach der überprüfung, um sicherzustellen, dass das Modul nicht bereits geladen ist) mit der-ErrorAction Stop
so eingestellt, dass der import des Moduls schlägt fehl, wenn der import von dem abhängigen Modul fehlschlägt.Eigentlich, wenn Sie wollten sehen, was für Versionen ...
Nur daran erinnern, dass dies nicht dienen Dokumentation, so dass, wenn Sie die Verteilung der Modul -, Benutzer nicht wissen, über die Abhängigkeiten.
PowerShell V3 funktioniert etwas anders. Benötigte Module werden jetzt geladen, wenn Sie laden ein manifest mit diesem Schlüssel angegeben. Auch, entfernen Sie das Modul nicht entladen wird, das gewünschte Modul, egal, wie das Modul geladen wurde. Interessanterweise-Kraft scheint nicht zu zeigen das automatische laden der benötigten module(s).
Edit: Wenn dein Modul ist nicht in einem der Standardverzeichnisse, müssen Sie den Pfad zu diesem Modul (oder der übergeordnete Ordner, unter dem sich das Modul befindet), um die
$env:PSModulePath
variable.Seite Hinweis: da PSv3-es ist die Unterstützung für die
#Requires
Befehl in Skripte. Sie können diese nutzen, um (1) Versuch zum laden eines Moduls Abhängigkeit in Ihrem Skript und (2) erlischt, wenn das Modul nicht/kann nicht geladen werden.Dieser muss auch, dass die Module irgendwo unter
$env:PSModulePath
, die festgelegt werden müssen vor das Skript ausgeführt.$env:PSModulePath
, sonst PowerShell finden nicht das gewünschte Modul.