PowerShellGetの刷新

Microsoftは2020年3月30日(米国時間)、「PowerShellGet 3.0 Preview 1|PowerShell」において、PowerShellGetの次期バージョンへ向けた初のプレビュー版となる「PowerShellGet 3.0 Preview 1」の公開を伝えた。これを受け、前回は、PowerShell 7.0.0に同梱されている現在のPowerShellGetについて取り上げた。今回はこの新しいプレビュー版が最終的にどのような機能を実現することを目指しているかについて、取り上げようと思う。

PowerShellGet 3.0はPowerShellGetにとってただのバージョンアップという位置付けではなく、実装系の抜本的な変更とユーザーエクスペリエンスの向上を目的とした操作方法の変更を伴う、大幅な刷新となる。ユーザーからのフィードバックを取り入れ、真に使いやすいモジュール管理システムを実現しようという意気込みが込められたバージョンだ。

PowerShellGet 3.0が目指すもの

前述したように、PowerShellGet 3.0は完全に書き換えを行うもので、PowerShellGetにとって大きな挑戦となる。このPowerShellGet 3.0は次のような目標を実現することを目指している。

  • OneGet、NuGetまたはそれ以外のパッケージプロバイダに依存しないように変更。PowerShellGetが最初に構築されたときにこれらプロバイダーモデルに依存するように設計されたが、現在ではこの仕組みが保守性の低下を招いている。こうしたパッケージプロバイダへの依存を避け、コードベースの保守性を向上させる
  • PowerShellGetはPowerShellスクリプトとして開発されてきたが、これをC#で書き換える。これまでに得た教訓を活かしてよりクリーンなインタフェースと実装を実現し、バグが発生したときにより迅速に問題を回避できるようにする。これまでの実装は初期の設計がユーザーのニーズに合致していない部分があり、全てのニーズや修正に応えるのが難しい面があった
  • アーキテクチャの刷新。PowerShellGetはもともと開発の初期の段階でアーキテクチャを決定したためか、ユーザーからの要望の多くは解決が困難なものだった。PowerShellGetではこうした問題を整理し解決することを目指す


PowerShellGet 3.0のプレビュー版は月に約1回のペースでアップデートが行われることが計画されている。月に1回のペースでプレビュー2、プレビュー3、プレビュー4……とリリースが行われることになる。ユーザーのフィードバックを開発に取り込みつつ、品質と完全性が十分なレベルに到達したと判断した段階で「リリース候補版」を公開し、その後で公式リリース(GA:一般提供)になるとされている。

今のところタイムラインベースではなく品質ベースでリリースが行われることになっているが、今年の後半にリリースしたいとされており、大枠の目標としてPowerShell 7.1のリリースまでにPowerShellGet 3.0 GAを公開したい旨であることが伺える。

コマンドレットはPSResourceで統一

PowerShellGet 3.0 Preview 1を見るとわかるが、用意されている新しいコマンドレットの名称に「PSResource」という名前が含まれている。モジュール、スクリプト、DSCResource、RoleCapability、Commandの全てに「PSResource」という名前が含まれるようになっているのだ。

例えば、PowerShellGet 3.0 Preview 1では次のコマンドレットおよびパラメータが実装されている。

コマンドレット パラメータ
Install-PSResource -Name、 -Version、 -Prerelease、 -Repository、 -Credential、 -Scope、 -Reinstall
Update-PSResource -Name、 -Version、 -Prerelease、 -Credential、 -Repository
Find-PSResource -Name、 -Type、 -Version、 -Prerelease、 -ModuleName、 -Tags、 -Repository、 -Credential、 -IncludeDependencies
Uninstall-PSResource -Name、 -Version、 -PrereleaseOnly
Save-PSResource -Name、 -Version、 -Prerelease、 -Repository、 -Credential、 -AsNupkg、 -Path
Get-PSResource -Name、 -Version
Register-PSResourceRepository -Name、 -URL、 -PSGallery、 -Credential、 -Trusted、 -Priority
Unregister-PSResourceRepository -Name
Get-PSResourceRepository -Name、 -URL、 -Credential、 -Trusted、 -Priority

Preview 1の段階ではまだ実装されていないパラメータも多い。MicrosoftはPreview 1について、もし不具合だと思う挙動があったとしても、それはバグではなく、ただ単にまだ実装されていない機能というだけの場合もあると説明している。今後のリリースでさらに開発が進む予定であり、現段階ではまだ動作しない機能も多い。

PowerShellGet 3.0 GA以降に考えている改善

MicrosoftはPowerShellGet 3.0を公開したあとに行う取り組みについてもすでに検討している。PowerShellGet 3.0 GAまでは上記目標を達成することを目指し、一般提供の後はモジュールのサポートを向上させるために次の機能の開発に取り組むとしている。下記機能に関しては、現段階ではまだ実装には取り掛かっていないとされている。

  • リポジトリに関する操作を行う場合に、現在保持しているキャッシュと新しいキャッシュが一致しているかどうかをチェックし、一致していない場合には自動的にアップデートを行う機能の実装。どの程度の周期でアップデートを行うかも検討する必要がある
  • PowerShellGet 3.0ではPowerShellGet 2.xまでのコマンドレットとは異なる名前規則を採用している(そのために同居させることができる)。このため、これまで使っていたコマンドレットはPowerShellGet 3.0では使用できない。しかし、これはユーザーにとってストレスとなる可能性がある。Microsoftはこうした問題を解決する方法として、Install-Moduleといったこれまでのコマンドレットと同じ名前で該当する機能を呼び出す「Enable-PowerShellGetAlias」コマンドレットの導入を模索する
  • モジュールのアップデートやアンインストールなどによって孤立したモジュール(孤児モジュール)を自動的に削除する方法を模索する


上記リストからわかるように、PowerShellGet 3.0 GAの後はキャッシュの自動アップデートやほかのモジュールのアンインストールなどによって孤立してしまったモジュール(孤児モジュール)などを自動的にアンインストールする機能を模索するとしている。モジュール管理機能としての利便性を高める狙いがあるものと見られる。

上記機能はLinuxの主要なパッケージ管理システムではすでに実現されている機能だ。程度や利便性、整理の差はあるものの、大体どのパッケージ管理システムでも実現されている。PowerShellGet 3.0はLinuxのパッケージ管理システムで実現されている機能なども参考にしつつ、ユーザーにとって扱いやすい機能を目指しているようだ。