Windows 10に入っているWindows PowerShell 5.1からは、PackageManagement(以降OneGetと称しておきます) が利用できるようになっています。*1
OneGetはもどかしい気分になることが多いので少し情報を整理しましょう。
なお、ここではFind-Package
とか使い方は説明しません。
いくつか触れておきます。
動作にバグがまだまだある
残念ながらOneGetは2015/8/28現在のWindows 10 build 10240においてもバグは残っています。期待した動作と違って、気持ち悪いと感じることもあるでしょう。
インストールに失敗してもインストールされた扱い
インストールが気持ち悪い挙動の例です。
Install-Package
を使ってインストール中にキャンセル、あるいはエラーが起こってもパッケージがインストールされたことになる
通常、インストールがエラーなく成功した場合にのみインストールされることを期待するので、とても気持ちが悪い挙動です。
この場合、一度対象のパッケージをアンインストールすればokです。
Uninstall-Package <PackageName>
アンインストールが不完全な場合がある
アンインストールも、プロバイダ側で正確に組まれてないとできなかったりもします。*2
ARP (Add/Remove Program = プログラムと機能に入っているいつものやつです)のパッケージに関しては、swidtagに記述されたアンインストールストリングを呼び出します。そのため「通常のプログラムと機能からのアンインストール」とUninstall-Package
は同じ挙動ですが、サイレントアンインストールでないことがほとんどです。もどかしい。
Chocolateyから取得したパッケージはもっとひどいことが多く感じるでしょう。Uninstall-ChooclateyPakcage
の実装次第とはいえアンインストールできないことも多いのは事実です。特に.exeのインストールが実態だとするともはやアンインストールは期待できなかったりもします
こんな罠もありますが、便利は便利です。
インストール先を任意で選べない
Issueがあります。
が、どうも乗り気じゃないようで.... 世の中のパッケージマネージャーは選べるし、選べてよいのでは。
補足
いくつかOneGetの知っておくといい補足です。知らなくても困ることはあんまりないでしょうが。
OneGet は API基盤
OneGetは、NuGetやChocolatey、ARPなど各種プロバイダーソースを統一的にコマンドから扱えるAPI基盤です。
複数のプロバイダソースを扱うことを目材してるのを示すように、GitHubリポジトリのIssueでは下記の様々なソースをターゲットとして構想されています。
それを表現するためMSDNブログで使われる表現が以下です。
「OneGet は ただのパッケージマネージャーではなく パッケージマネージャーマネージャーであり、API基盤だ。」
言ってることはかっこいいですが、現時点ではまだまだプロバイダーも足りません。 これからに期待ですね。
なお、Windows 10リリース時点では以下のソースが標準でサポートされています。
- MSI
- MSU
- BootStrap
- ARP (Add/remove programs)
- NuGet
- Chocolatey
これらを統一したコマンド体系Xxxx-PackageZzzz
で呼び出すのがOneGetということです。PackageManagementモジュールに含まれるCmdletは以下の通りです。
Get-Command -Module PackageManagement
CommandType Name Version Source ----------- ---- ------- ------ Cmdlet Find-Package 1.0.0.0 PackageManagement Cmdlet Get-Package 1.0.0.0 PackageManagement Cmdlet Get-PackageProvider 1.0.0.0 PackageManagement Cmdlet Get-PackageSource 1.0.0.0 PackageManagement Cmdlet Install-Package 1.0.0.0 PackageManagement Cmdlet Register-PackageSource 1.0.0.0 PackageManagement Cmdlet Save-Package 1.0.0.0 PackageManagement Cmdlet Set-PackageSource 1.0.0.0 PackageManagement Cmdlet Uninstall-Package 1.0.0.0 PackageManagement Cmdlet Unregister-PackageSource 1.0.0.0 PackageManagement
ちなみにAPI基盤の例としては、PowerShellモジュールのギャラリー PowerShellGet もNuGetフィードをベースにしています。そして、操作に実際に呼び出すコマンドの裏ではOneGet APIを呼び出しています。
OneGetが目指している姿
OneGetが目指している姿も示されています。
https://blogs.msdn.com/b/garretts/archive/2015/05/05/8-laws-of-software-installation.aspx
ソフトウェアインベントリと、各種パッケージプロバイダの透過的な扱い。現時点ではまだまだ困難が多いですね。MSIに統一されてたりしたら楽だったんでしょうが... そんなのはナンセンスですね。
目指している姿として、なんとなく把握しておくといいでしょう。
OneGet のイメージと実際のずれを補完したいなら
もし気になる場合、OneGet開発者の記事を見ておくと持っているイメージとのずれが保管されるかもです。
まとめ
なんとなくOneGetについて情報が整理されれば幸いです。まだまだ情報が入り乱れてますね。
次回は、Private NuGet Feedから、自社専用のパッケージソースを構築する方法を見てみましょう。