Windows10のPackageManagementはインストール先を任意指定できない
☆★☆祝・winget(今後アップデート)にて-lオプション搭載☆★☆
タイトルの通りです。タイトルの意味が分かればこの記事はもう読まなくても大丈夫です。なぜなら解決策なぞ一切提示していないので。あきらめてインストールされっぱなしにするかー!と楽しいパッケージ管理ライフに舵を切りましょう。殆ど愚痴なのでWindowsのパッケージ管理機能に興味がある人は下の記事を開いて、この記事はさっさと閉じてください。
PackageManagementって何さ
"PackageManagement"はWindows10から標準搭載されたWindows向けパッケージ管理ツール…というか機能群です。要するにaptやyumやbrewみたいなことをWindowsでもできちゃうのよってやつです。PowerShellに実装されてますので、PowerShellやWindows Terminalを管理者権限で起動して使います。
Windowsでソフトウェアを新しくインストールすると言ったらCD-ROMからインストール(古い)するかブラウザでダウンロードしてzipやlzhを解凍するなりインストーラを走らせるなりしたわけですが、PackageManagementを使いこなせばコマンド一発でインストールが終わります。たとえばffmpegならこんな感じ。
Install-Package -Name ffmpeg -ProviderName ChocolateyGet -Force
「aptよりコマンドが長いじゃねえか!」と思わず口にしてしまった方、その反応は正しい。PowerShellは何でもかんでもコマンドが長いことでおなじみなので、自分でエイリアス設定するなり短くする工夫はしたほうがいい。僕は今日触りはじめたのでこれからですが…ぶっちゃけこの先PackageManagementを何回使うかなと思ったら手間が惜しい。なんでかというと使わなくても何とかなるようなPC環境だし、何よりもタイトルにあるような問題があるので。
よく考えたらaptにもインストール先をコントロールするようなオプションなかったような気がしてきた。パッケージ管理を始めるときにディレクトリのことを考える僕がおかしいのかい…?
PackageManagementは何もしない
問題の全容を理解できるよう、PackageManagementについてもっと詳しく書いていきます。ここで書いとかないと自分が状況を整理できん。
PackageManagementは正確に言うとパッケージ管理ソフトではありません。実際は「パッケージ管理ソフトたち」のマネージャという表現がしっくりきます。
PackageManagementが持つ機能は「複数のパッケージ管理ソフトをとりまとめて、ひとつのパッケージ管理ソフトっぽく振る舞う」ことです。NuGet、PowerShellGet、msi、Chocolateyなどのパッケージプロバイダと呼ばれるソフトを持っているサーバを横断して検索したりするのを可能にしています。要するにパッケージ管理ソフトたちのラッパーなので、PackageManagementが独自にパッケージプロバイダを持ってるとかそういうことはありません。
半日ずっとPackageManagementで遊んだ印象としては、Chocolatey以外にはあんまり使いたいソフトがラインナップされていない…そもそもChocolatey以外のプロバイダはバリバリWindows開発ツールくらいしかない(それでも大量ではある)ので、みんなが遊ぶようなソフトはPackageManagement通さずとも落とせるじゃん!…という感じです。choco.exeをChocolateyGetに繋ぐ方法がわからないからとりあえずInstall-Packageしてる感じです。どうしてこうなった
インストール先を決めているのは誰だ?パッケージ君か…
フリーソフト全盛期を生きてきて、zipを落として好きなフォルダに置いていた時代を過ごしているので、パッケージをPackageManagementの好きなように配置されてしまうのがちょっと性に合わないんです。が、Install-Packageにもchoco.exeにも"-Path"とか"-Destination"みたいなオプションは存在しません。どうあがいてもあの子たちの思うがままインストールさせられるのです。ffftpをインストールしたら行先もわからず、実は調べたらChocolateyでの更新だけ止まってるからブラウザから落とす方がいいことが分かったり散々なことになっているわけです。
調べるうちに次の記事を見つけました。
パッケージインストールの際は、パッケージのインストール設定にインストール先が書かれてますよ…ということで、無力なのは僕だけじゃありませんでした。choco.exeくんもパッケージさんのいいなりだったのね…
記事を参考にしながら、ffmpegのパッケージについての解説を読みます。
$ErrorActionPreference = 'Stop'
$toolsPath = Split-Path $MyInvocation.MyCommand.Definition
$packageArgs = @{
PackageName = 'ffmpeg'
FileFullPath = Get-Item $toolsPath\*_x32.zip
FileFullPath64 = Get-Item $toolsPath\*_x64.zip
Destination = $toolsPath
}
上に掲げたのはインストール設定ファイル"tools\chocolateyInstall.ps1"の一部です。ここ以外はunzipコマンドみたいなものなのでここが8割です。PowerShellスクリプトは僕も読めませんが、ここでやってるのは「chocoの実行ディレクトリを取得してインストール先のパス設定に使う」設定です。つまりChocolateyのインストール先をいじくればパッケージのインストール先も変えられるのです。面倒ですね!
解決するにはchocoでパッケージをインストールせずにダウンロードのみ行い、インストール設定ファイルを書き換えてからchocoのローカルファイルインストールを走らせるほかなさそうということです。アップデートのたびにそれを手動でやるか、もしくはパッケージにそれぞれバッチを作るか…パッケージ管理の意味とは、PackageManagementどこいった?
bash的PowerShellライフ?
よく考えたら、bashでaptをやってた時は、インストール先なんて気にせずに落としたらどこにいてもコマンドが使えたわけです。どこのディレクトリに実体があるかなんてそんなに用事がないのです。
エクスプローラからexeを起動するんじゃなくて、開発環境としてバリバリPowerShellを使いたかったんだよなきっと。bashとWindowsを行き来して文字コードでてんやわんやせず開発したかったんだよな。楽しいWindowsと新しいパッケージ管理に目をキラキラさせていたわけです、お昼の僕は。
そこからPackageManagementを触り続けて夜、だいたい分かった僕は「まあそこそこに、そこそこに」という気分で寝る前にnoteにこの半日の搾りかすのような成果を記録することにしたのです。
明後日にはこんなこと忘れて、ブラウザからffmpegのNightly Buildを落としてるんだろうな。
(ffmpegのNightly BuildはChocolateyに上がってません。当たり前だよNightlyだもの)