Windows PowerShell と PowerShell Core に対応した PowerShell モジュールを作成する
はじめに
PowerShell の新しいバージョンである PowerShell Core が提供されて久しくなりました。PowerShell モジュールを開発して一般に提供する場合、互換性を考慮して旧来の Windows PowerShell もサポートする必要があります。Windows PowerShell は .NET Framework で動作し、PowerShell Core は .NET Core で動作します。両方に対応したモジュールを作成するには工夫が必要です。
モジュールを PowerShell スクリプトで記述する
PowerShell スクリプト (psm1 ファイル) は、実行される PowerShell のバージョンの影響を受けません。そのため、Windows PowerShell と PowerShell Core のどちらでも動作します。ただし、PowerShell Core での破壊的変更には注意が必要です。
また、PowerShell スクリプトが外部ライブラリ (dll ファイル) に依存する場合、そのライブラリが .NET Standard で作成されている必要があります。
マニフェストファイルで動的にモジュールを読み込む
モジュールをバイナリ (.dll ファイル) で開発する場合、マニフェストファイル (psd1 ファイル) では RootModule の宣言に関数を指定でき、その中で $PSEdition を判定して読み込むモジュールを変更できます。.NET Framework と .NET Core の両方でビルドする必要がありますが、安全にモジュールを読み込むことができます。詳細は以下のドキュメントを参照してください。
モジュールを .NET Standard で作成する
モジュールを .NET Standard (netstandard2.0) でビルドすることで、Windows PowerShell と PowerShell Core の両方で動作させることができます。これは Az モジュールが採用している方法です。この方法の主な課題は、PowerShell のコアライブラリである System.Management.Automation.dll の参照です。以下のように GAC をパス指定で読み込めば解決できます。実行時には必ず System.Management.Automation.dll が読み込まれているため、問題になることはありません。
<ItemGroup>
<Reference Include="System.Management.Automation">
<HintPath>C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Management.Automation\v4.0_3.0.0.0__31bf3856ad364e35\System.Management.Automation.dll</HintPath>
<Private>false</Private>
</Reference>
</ItemGroup>
この場合も、依存関係のある外部ライブラリについては .NET Standard 化されていないと利用が難しいです。
おわりに
依存関係もまとめて解決できるため、マニフェストファイルで制御する方法が最も確実です。ただし、他の方法が悪いというわけではないので、状況に応じて使いわけてください。
Discussion