PowerShellGet プライベート リポジトリの操作

PowerShellGet モジュールでは、PowerShell ギャラリー以外のリポジトリがサポートされています。 これらのコマンドレットにより、次のシナリオが可能になります。

  • 環境内で使用するための、信頼された事前検証済みの PowerShell モジュールのセットをサポートする
  • PowerShell モジュールまたはスクリプトを構築する CI/CD パイプラインをテストする
  • インターネットにアクセスできないシステムに PowerShell スクリプトおよびモジュールを提供する
  • 組織でのみ使用できる PowerShell スクリプトとモジュールを提供する

この記事では、ローカル PowerShell リポジトリを設定する方法について説明します。 また、PowerShell ギャラリーから使用できる OfflinePowerShellGetDeploy モジュールについても説明します。 このモジュールには、ローカル リポジトリに PowerShellGet の最新バージョンをインストールするためのコマンドレットが含まれています。

ローカル リポジトリの種類

ローカル PSRepository を作成するには、次の 2 つの方法があります: NuGet サーバーまたはファイル共有。 種類ごとに長所と短所があります。

NuGet サーバー

長所 短所
PowerShellGallery 機能を模倣する 多層アプリでは、運用の計画とサポートが必要です
NuGet は、Visual Studio や他のツールと統合します 認証モデルと NuGet アカウントの管理が必要です
NuGet では、.Nupkg パッケージ内のメタデータがサポートされます 発行には、API キーの管理とメンテナンスが必要です
検索、パッケージ管理などが提供されます

ファイル共有

長所 短所
セットアップ、バックアップ、メンテナンスが簡単です 基本的なファイル共有以外の UI はありません
セキュリティ モデルがシンプルです (共有に対するユーザーのアクセス許可) セキュリティに制限があり、誰が何を更新したか記録されません
既存の項目を置換などの制約はありません

PowerShellGet はどちらの種類およびサポートでも動作し、バージョンと依存関係のインストールを特定します。 ただし、PowerShell ギャラリーでは動作するいくつかの機能が、基本の NuGet サーバーまたはファイル共有に対しては使用できません。 スクリプト、モジュール、DSC リソース、またはロール機能に違いはありません。

NuGet.Server リポジトリの作成

次の記事では、独自の NuGet サーバーを設定するための手順が示されています。

パッケージを追加する時点までの手順に従います。 パッケージを公開するための手順は、この記事の後半で説明します。

ファイル共有ベースのリポジトリでは、ユーザーにファイル共有にアクセスするためのアクセス許可があることを確認します。

ローカル リポジトリを登録する

リポジトリを使用するには、その前に Register-PSRepository コマンドを使用して登録する必要があります。 次の例では、 InstallationPolicy は、独自のリポジトリを Trusted信頼することを前提として に設定されています。

# 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

2 つのコマンドでの ScriptSourceLocation の処理方法の違いに注意してください。 ファイル共有ベースのリポジトリでは、SourceLocationScriptSourceLocation が一致している必要があります。 Web ベースのリポジトリでは、それらが異なる必要があるため、この例では、SourceLocation の最後に "/" が追加されています。

NFS や SMB などのファイル共有プロトコルを使用する場合は、プロトコルをセキュリティで保護するための推奨ガイダンスに従ってください。 Windows での SMB のセキュリティ保護の詳細については、「SMB セキュリティの強化][09]」を参照してください。

新しく作成する PSRepository を既定のリポジトリにする場合は、他のすべての PSRepository の登録を解除する必要があります。 次に例を示します。

Unregister-PSRepository -Name PSGallery

注意

リポジトリ名 "PSGallery" は、PowerShell ギャラリーで使用するために予約されています。 PSGallery の登録を解除することはできますが、PSGallery という名前を他のリポジトリに再利用することはできません。

PSGallery を元に戻す必要がある場合は、次のコマンドを実行します。

Register-PSRepository -Default

ローカル リポジトリに発行する

ローカル PSRepository を登録した後は、ローカル PSRepository に対して発行できます。 2 つの主な発行シナリオがあります。独自のモジュールの発行と、PSGallery からのモジュールの発行です。

自分で作成したモジュールを発行する

PowerShell ギャラリーの場合と同じように、Publish-Module および Publish-Script を使用してローカル環境の PSRepository に自分のモジュールを発行します。

  • コードの場所を指定します
  • API キーを指定します
  • リポジトリ名を指定します。 たとえば、-PSRepository LocalPSRepo のように指定します。

Note

NuGet サーバーにアカウントを作成した後、サインインし、API キーを生成して保存する必要があります。 ファイル共有の場合は、NuGetApiKey の値に対して任意の空白でない文字列を使用します。

例 :

# Publish to a NuGet Server repository using my NuGetAPI key
$publishModuleSplat = @{
    Path = 'c:\projects\MyModule'
    Repository = 'LocalPsRepo'
    NuGetApiKey = $nuGetApiKey
}
Publish-Module @publishModuleSplat

重要

セキュリティを確保するために、API キーをスクリプトでハードコーディングしないでください。 セキュリティ保護されたキー管理システムを使用します。 コマンドを手動で実行する場合、API キーをプレーンテキストとして渡してログに記録されないようにしないでください。コマンドレットを Read-Host 使用して、API キーの値を安全に渡すことができます。

# 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

PSGallery からモジュールを発行する

PSGallery からローカル PSRepository にモジュールを発行するには、 コマンドレットを Save-Package 使用します。

  • パッケージの名前を指定します
  • プロバイダーとして "NuGet" を指定します
  • ソースとして PSGallery の場所を指定します (https://www.powershellgallery.com/api/v2)
  • ローカル リポジトリへのパスを指定します

例:

# 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

ローカル PSRepository が Web ベースの場合は、 を使用 nuget.exe して発行する追加の手順が必要です。 nuget.exe の使用についてはドキュメントをご覧ください。

オフラインのシステムに PowerShellGet をインストールする

インターネットに接続されていないシステムが必要な環境に PowerShellGet を展開するのは困難です。 PowerShellGet を初めて使用するときは、最新バージョンをインストールするブートストラップ プロセスがあります。 PowerShell ギャラリーの OfflinePowerShellGetDeploy モジュールでは、このブートストラップ プロセスをサポートするコマンドレットが提供されています。

オフラインの展開をブートストラップするには、次のことを行う必要があります。

  • OfflinePowerShellGetDeploy をダウンロードし、インターネットに接続されたシステムと接続されていないシステムにインストールします
  • Save-PowerShellGetForOffline コマンドレットを使用して、PowerShellGet とその依存関係をインターネットに接続されたシステムにダウンロードします
  • PowerShellGet とその依存関係を、インターネットに接続されたシステムから切断されたシステムにコピーします
  • 切断されたシステムで Install-PowerShellGetOffline を使用して、PowerShellGet とその依存関係を適切なフォルダーに配置します

次のコマンドでは、Save-PowerShellGetForOffline を使用してすべてのコンポーネントを f:\OfflinePowerShellGet フォルダーに配置します

# 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'

この時点で、F:\OfflinePowerShellGet の内容を切断されたシステムで使用できるようにする必要があります。 Install-PowerShellGetOffline コマンドレットを実行し、切断されたシステムに PowerShellGet をインストールします。

注意

これらのコマンドを実行する前に、PowerShell セッションで PowerShellGet を実行しないようにすることが重要です。 PowerShellGet がセッションに読み込まれると、コンポーネントを更新できません。 誤って PowerShellGet を開始した場合は、終了して、PowerShell を再起動します。

Import-Module F:\OfflinePowerShellGetDeploy
Install-PowerShellGetOffline -LocalFolder 'F:\OfflinePowerShellGet'

これらのコマンドの実行が済むと、ローカル リポジトリに PowerShellGet を発行できるようになります。

# Publish to a NuGet Server repository using my NuGetAPI key
$publishModuleSplat = @{
    Path = 'F:\OfflinePowershellGet'
    Repository = 'LocalPsRepo'
    NuGetApiKey = $nuGetApiKey
}
Publish-Module @publishModuleSplat

重要

セキュリティを確保するために、API キーをスクリプトでハードコーディングしないでください。 セキュリティ保護されたキー管理システムを使用します。 コマンドを手動で実行する場合、API キーをプレーンテキストとして渡してログに記録されないようにしないでください。コマンドレットを Read-Host 使用して、API キーの値を安全に渡すことができます。

# 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

パッケージ化ソリューションを使用して PowerShellGet リポジトリをホストする

また、Azure Artifacts などのパッケージ化ソリューションを使用して、プライベートまたはパブリックの PowerShellGet リポジトリをホストすることもできます。 詳細と手順については、Azure Artifacts のドキュメントを参照してください。