Arbeiten mit privaten PowerShellGet-Repositorys
Das PowerShellGet-Modul unterstützt andere Repositorys als den PowerShell-Katalog. Diese Cmdlets ermöglichen die folgenden Szenarien:
- Unterstützung eines vertrauenswürdigen, bereits überprüften Satzes von PowerShell-Modulen für die Verwendung in Ihrer Umgebung
- Testen einer CI/CD-Pipeline, die PowerShell-Module oder -Skripts erstellt
- Bereitstellen von PowerShell-Skripts und -Modulen auf Systemen, die nicht auf das Internet zugreifen können
- Bereitstellen von PowerShell-Skripts und -Modulen nur für Ihre Organisation
Dieser Artikel beschreibt, wie Sie ein lokales PowerShell-Repository einrichten. Der Artikel behandelt auch das im PowerShell-Katalog verfügbare OfflinePowerShellGetDeploy-Modul. Dieses Modul enthält Cmdlets zum Installieren der neuesten Version von PowerShellGet in Ihrem lokalen Repository.
Lokale Repositorytypen
Lokale PSRepositorys können auf zwei Arten erstellt werden: NuGet-Server oder Dateifreigabe. Jeder Typ hat Vor- und Nachteile:
NuGet-Server
Vorteile | Nachteile |
---|---|
Nachahmen der PowerShellGallery-Funktionalität | App mit mehreren Ebenen erfordert Planung des Betriebs und Support |
NuGet integriert in Visual Studio, andere Tools | Authentifizierungsmodell und NuGet-Kontenverwaltung erforderlich |
NuGet unterstützt Metadaten in .Nupkg -Paketen |
Veröffentlichung erfordert Verwaltung und Wartung des API-Schlüssels |
Ermöglicht Suche, Paketverwaltung usw. |
Dateifreigabe
Vorteile | Nachteile |
---|---|
Kann einfach eingerichtet, gesichert und verwaltet werden | Keine Benutzeroberfläche außer einfacher Dateifreigabe |
Einfaches Sicherheitsmodell – Benutzerberechtigungen für Freigabe | Eingeschränkte Sicherheit und keine Aufzeichnung darüber, wer Updates ausführt |
Keine Einschränkungen, wie z.B. das Ersetzen vorhandener Elemente |
PowerShellGet funktioniert mit jedem Typ und unterstützt das Suchen von Versionen und die Installation von Abhängigkeiten. Einige Funktionen, die mit dem PowerShell-Katalog funktionieren, sind jedoch nicht für Basis-NuGet-Server oder Dateifreigaben verfügbar. Es gibt keine Unterscheidung zwischen Skripts, Modulen, DSC-Ressourcen oder Rollenfunktionen.
Erstellen eines NuGet.Server-Repositorys
Im folgenden Artikel sind die Schritte zum Einrichten Ihres eigenen NuGet-Servers aufgeführt.
Führen Sie die Schritte bis zum Punkt des Hinzufügens von Paketen aus. Die Schritte zum Veröffentlichen eines Pakets werden weiter unten in diesem Artikel behandelt.
Stellen Sie bei einem Repository auf Dateifreigabebasis sicher, dass Ihre Benutzer über Berechtigungen zum Zugriff auf die Dateifreigabe verfügen.
Registrieren eines lokalen Repositorys
Bevor ein Repository verwendet werden kann, muss es mithilfe des Register-PSRepository
-Befehls registriert werden. In den folgenden Beispielen ist die InstallationPolicy auf Trusted
festgelegt, unter der Annahme, dass Sie Ihrem eigenen Repository vertrauen.
# Register a NuGet-based server
$registerPSRepositorySplat = @{
Name = 'LocalPSRepo'
SourceLocation = 'http://MyLocalNuget/Api/V2/'
ScriptSourceLocation = 'http://MyLocalNuget/Api/V2'
InstallationPolicy = 'Trusted'
}
Register-PSRepository @registerPSRepositorySplat
# Register a file share on my local machine
$registerPSRepositorySplat = @{
Name = 'LocalPSRepo'
SourceLocation = '\\localhost\PSRepoLocal\'
ScriptSourceLocation = '\\localhost\PSRepoLocal\'
InstallationPolicy = 'Trusted'
}
Register-PSRepository @registerPSRepositorySplat
Beachten Sie, wie unterschiedlich die beiden Befehle ScriptSourceLocation behandeln. Für Repositorys auf Dateifreigabebasis müssen SourceLocation und ScriptSourceLocation übereinstimmen. Für ein webbasiertes Repository müssen sie unterschiedlich sein, also wird SourceLocation in diesem Beispiel ein nachstehender „/“ angefügt.
Wenn Sie ein Dateifreigabeprotokoll wie NFS oder SMB verwenden, befolgen Sie unbedingt die empfohlene Anleitung zum Schützen des Protokolls. Weitere Informationen zum Schützen von SMB unter Windows finden Sie unter [SMB-Sicherheitsverbesserungen][09].
Wenn das neu erstellte PSRepository das Standardrepository sein soll, müssen Sie die Registrierung aller anderen PSRepositorys aufheben. Beispiel:
Unregister-PSRepository -Name PSGallery
Hinweis
Das Repository mit dem Namen PSGallery ist für die Verwendung durch den PowerShell-Katalog reserviert. Sie können die Registrierung von PSGallery aufheben, aber den Namen PSGallery nicht für ein anderes Repository wiederverwenden.
Wenn Sie PSGallery wiederherstellen müssen, führen Sie den folgenden Befehl aus:
Register-PSRepository -Default
Veröffentlichung in einem lokalen Repository
Nachdem Sie das lokale PSRepository registriert haben, können Sie in Ihrem lokalen PSRepository veröffentlichen. Es gibt zwei Hauptveröffentlichungsszenarien: Veröffentlichen Ihres eigenen Moduls und Veröffentlichen eines Moduls aus der PSGallery.
Veröffentlichung eines von Ihnen erstellten Moduls
Veröffentlichen Sie Ihr Modul mit Publish-Module
und Publish-Script
genauso wie für den PowerShell-Katalog in Ihrem lokalen PSRepository.
- Geben Sie den Speicherort für Ihren Code an
- Geben Sie einen API-Schlüssel an
- Geben Sie den Namen des Repositorys an. Zum Beispiel,
-PSRepository LocalPSRepo
Hinweis
Sie müssen ein Konto auf dem NuGet-Server erstellen und sich dann anmelden, um den API-Schlüssel zu generieren und zu speichern. Verwenden Sie für eine Dateifreigabe eine beliebige nicht leere Zeichenfolge für den NuGetApiKey-Wert.
Beispiele:
# Publish to a NuGet Server repository using my NuGetAPI key
$publishModuleSplat = @{
Path = 'c:\projects\MyModule'
Repository = 'LocalPsRepo'
NuGetApiKey = $nuGetApiKey
}
Publish-Module @publishModuleSplat
Wichtig
Um die Sicherheit zu gewährleisten, sollten API-Schlüssel in Skripts nicht hartcodiert werden. Verwenden Sie ein sicheres Schlüsselverwaltungssystem. Beim manuellen Ausführen eines Befehls sollten API-Schlüssel nicht als Nur-Text übergeben werden, um die Protokollierung zu vermeiden. Das Read-Host
Cmdlet kann verwendet werden, um den Wert des API-Schlüssels sicher zu übergeben.
# Publish to a file share repo - the NuGet API key must be a non-blank string
$publishModuleSplat = @{
Path = 'c:\projects\MyModule'
Repository = 'LocalPsRepo'
NuGetApiKey = 'AnyStringWillDo'
}
Publish-Module @publishModuleSplat
Veröffentlichung eines Moduls aus der PSGallery
Um ein Modul aus der PSGallery in Ihrem lokalen PSRepository zu veröffentlichen, können Sie das Save-Package
Cmdlet verwenden.
- Geben Sie den Namen des Pakets an
- Geben Sie „NuGet“ als Anbieter an
- Geben Sie den PSGallery-Speicherort als Quelle an (
https://www.powershellgallery.com/api/v2
) - Geben Sie den Pfad zu Ihrem lokalen Repository an
Beispiel:
# Publish from the PSGallery to your local Repository
$savePackageSplat = @{
Name = 'PackageName'
ProviderName = 'NuGet'
Source = 'https://www.powershellgallery.com/api/v2'
Path = '\\localhost\PSRepoLocal\'
}
Save-Package @savePackageSplat
Wenn Ihr lokales PSRepository webbasiert ist, ist ein zusätzlicher Schritt erforderlich, der zum Veröffentlichen verwendet nuget.exe
wird. Weitere Informationen finden Sie in der Dokumentation zur Verwendung von nuget.exe.
Installieren von PowerShellGet auf einem nicht verbundenen System
Das Bereitstellen von PowerShellGet ist schwierig in Umgebungen, die erfordern, dass Systeme nicht mit dem Internet verbunden sind. Der Bootstrapprozess von PowerShellGet installiert bei der ersten Verwendung die aktuelle Version. Das OfflinePowerShellGetDeploy-Modul im PowerShell-Katalog bietet Cmdlets, die diesen Bootstrapprozess unterstützen.
Um eine Offlinebereitstellung zu starten, müssen Sie Folgendes tun:
- OfflinePowerShellGetDeploy herunterladen und auf Ihrem mit dem Internet verbundenen System und Ihren nicht verbundenen Systemen installieren
- PowerShellGet und seine Abhängigkeiten mithilfe des
Save-PowerShellGetForOffline
-Cmdlets auf das mit dem Internet verbundene System herunterladen - PowerShellGet und seine Abhängigkeiten von dem mit dem Internet verbundenen System auf das nicht verbundene System kopieren
- Durch Verwendung von
Install-PowerShellGetOffline
auf dem nicht verbundenen System PowerShellGet und seine Abhängigkeiten in den richtigen Ordnern ablegen
Die folgenden Befehle legen mit Save-PowerShellGetForOffline
alle Komponenten im Ordner f:\OfflinePowerShellGet
ab.
# Requires -RunAsAdministrator
#Download the OfflinePowerShellGetDeploy to a location that can be accessed
# by both the connected and disconnected systems.
Save-Module -Name OfflinePowerShellGetDeploy -Path 'F:\' -Repository PSGallery
Import-Module F:\OfflinePowerShellGetDeploy
# Put PowerShellGet somewhere locally
Save-PowerShellGetForOffline -LocalFolder 'F:\OfflinePowerShellGet'
An diesem Punkt müssen Sie den Inhalt von F:\OfflinePowerShellGet
Ihren nicht verbundenen Systemen verfügbar machen. Führen Sie das Install-PowerShellGetOffline
-Cmdlet aus, um PowerShellGet auf dem nicht verbundenen System zu installieren.
Hinweis
Es ist wichtig, dass Sie PowerShellGet nicht in der PowerShell-Sitzung ausführen, bevor Sie diese Befehle ausführen. Sobald PowerShellGet in die Sitzung geladen wurde, können die Komponenten nicht mehr aktualisiert werden. Wenn Sie PowerShellGet versehentlich starten, beenden Sie PowerShell, und starten Sie es neu.
Import-Module F:\OfflinePowerShellGetDeploy
Install-PowerShellGetOffline -LocalFolder 'F:\OfflinePowerShellGet'
Nach dem Ausführen dieser Befehle können Sie PowerShellGet in Ihrem lokalen Repository veröffentlichen.
# Publish to a NuGet Server repository using my NuGetAPI key
$publishModuleSplat = @{
Path = 'F:\OfflinePowershellGet'
Repository = 'LocalPsRepo'
NuGetApiKey = $nuGetApiKey
}
Publish-Module @publishModuleSplat
Wichtig
Um die Sicherheit zu gewährleisten, sollten API-Schlüssel in Skripts nicht hartcodiert werden. Verwenden Sie ein sicheres Schlüsselverwaltungssystem. Wenn Sie einen Befehl manuell ausführen, sollten API-Schlüssel nicht als Nur-Text übergeben werden, um die Protokollierung zu vermeiden. Das Read-Host
Cmdlet kann verwendet werden, um den Wert des API-Schlüssels sicher zu übergeben.
# Publish to a file share repo - the NuGet API key must be a non-blank string
$publishModuleSplat = @{
Path = 'F:\OfflinePowerShellGet'
Repository = 'LocalPsRepo'
NuGetApiKey = 'AnyStringWillDo'
}
Publish-Module @publishModuleSplat
Verwenden von Paketierungslösungen zum Hosten von PowerShellGet-Repositorys
Sie können auch Paketierungslösungen wie Azure Artifacts verwenden, um ein privates oder öffentliches PowerShellGet-Repository zu hosten. Weitere Informationen und Anweisungen finden Sie in der Azure Artifacts-Dokumentation.
PowerShell Gallery