ScoopでWindowsにおける開発環境構築を最適化しよう
はじめに
Windows には他の OS には無い致命的な問題が一つあった。そう、OS 標準のパッケージマネージャが無いことだ。
Windows10 ではPackageManagementという大変素晴らしい OS 標準のパッケージマネージャが搭載された。
これでコマンドラインだけで開発環境をガンガン作れるに違いない。そう考える人がいてもおかしくはない。正直、僕だってそう思いたい。
PackageManagement の問題点
僕は PackageManagement のアーキテクチャが難しすぎる事は大きな問題だと考えている。このエントリを是非読んで欲しい。
もうね、何でこんなに大変なことになってるのかと。
いや、歴史的経緯を鑑みつつ、OS に標準搭載されるパッケージマネージャが持つべき仕組みをキチンと備えた妥当な設計になっているじゃないか、と強い調子で言われれば説得力があるようにも思える。
じゃあ、この素晴らしい抽象度で実装された PackageManagement 様におかれましては、それはそれは様々なバリエーションの動作をするんですよね?というと、実態はそうじゃない。
現在の PackageManagement は、雑に言えばChocolateyの何かややこしいラッパーでしかない。確かに、PowerShell Galleryには、沢山のモジュールがあるよ。あれ、便利なモジュールどんだけあんの?
僕としては、直接 Chocolatey 使えば良いと思うんだよね。ジッサイ。
「OS に標準搭載されたボキャブラリでアプリケーションをインストールし、アンインストールできることは大変すばらしい事だ!」
アア、ハイ、ソノトオリデスネ。
Chocolatey の問題点
Chocolatey 使ってて、まずダルいなって思うのは、UAC のポップアップ。コマンドラインで作業してるのに突然現れてマウスでクリックしないと先にすすめなくなるアレ。マジでイライラする。
Windows10 はマルチユーザ OS だけど、ユーザの切り替えなんてやってねぇよ。というか、複数の環境が必要なら Docker なり、Hyper-V なり使ってる。だからね、現在のユーザローカルにだけコマンドのパスが通れば良いんだよ。
次 にダルいなって思うのは、結構な頻度でアンインストールが失敗すること。インストールが綺麗にできる以上に、大事なのはアンインストールが綺麗にできることだ。
いやいや、MSI 形式のインストーラの問題だろ、それって言われれば、確かにちゃんと切り分けてないから、これは言いがかりかもしれないけどね。
ある程度の規模感で Chocolatey 使おうと思うと、ローカルリポジトリ的なものが欲しくなると思うんだけど、それを用意するのがとんでもなく面倒なのも辛い。確かに、How To Host Feed辺りをちゃんと読めば出来るよ。
面倒すぎるんで、僕としてはあんまやりたくない感じの手順だけどね。
というわけで、僕の個人的な趣向としては Chocolatey が嫌いだ。避けようが無くて使う事があるのは否定しないが、出来る限り使いたくないとさえ思っている。
Scoop について
というわけで、今週のおススメはScoopだ。
Scoop を使うべきか?
まず、最初に言っておく。Scoop は真っ当なパッケージマネージャではない。そして、linux 文化圏にいるけど、色々理由があって今は Windows を使 ってるって人間に向けて開発されている。
Scoop がどういう思想で作られているかみたいな話は、公式の Wiki に書いてある。
これを読めば、自分が Scoop を使うべきなのかは、ある程度ハッキリと理解できるだろう。
Windows しか使わないし、linux 文化圏のやり方を Windows 上でやることに意義を感じないなら、Scoop を使う必要はない。
そして、Scoop は開発環境を構築するためのツールだ。開発環境構築を楽にすることに強くフォーカスしているおかげで、色んなことがシンプルで簡単になっている。細かいことは、あまり考慮していない。
Scoop の何が素晴らしいか
ユーザのローカルディレクトリに何でもインストールするので、あのうざったい UAC ポップアップが出ない。
C:\Users\taichi\scoop\shims
みたいなディレクトリにコマンドをガンガン投げ込むスタイルだ。Scoop をインストールした時にこのディレクトリが PATH に追加される。
次に、ローカルディレクトリにファイルを展開していくスタイルなので、アンインストールが安定して動作する。特に難しい事をやってないので、それほど失敗する余地が無いってことなんだろう。
そして、Scoop でインストール可能なアプリケーションのメタデータは git リポジトリで管理している。だから、Scoop 標準のメタデータストア内に、欲しいものが無いなら比較的簡単にオレオレ Scoop リポジトリを作れる。
Scoop のダメなところ
Windows インストーラ文脈にのっていないこと
一番ダメなところで あり、素晴らしいところは、Windows のインストーラに関する文脈に全く乗っていないところだ。つまり、Scoop を使ってインストールしたアプリケーションは、Windows 標準のアプリと機能
から参照できない。ただし、これはmain
バケットからインストールしたものに限る。
main
バケットは、scoop がデフォルトで参照するアプリケーションリポジトリで、extras
バケットは、追加のコマンドを実行することで参照できるリポジトリだ。
中身をきちんと確認していないがphp
というバケットもある。流石の PHP だ。最近は、java
というバケットもあり、その中に oraclejdk と openjdk の両方が入っている。
extras
バケットには、exe や msi といった Windows のインストーラに関する文脈に乗っているものが含まれている。例えば、oraclejdk をインストールするなら、あの忌々しい UAC ポップアップが普通にポロリーンだ。
最新版しか使えないこと
アプリケーションは基本的に最新版しか使えないし、細かくリビジョンを切り替えることは出来ない。みんなが大好きな pyenv だの nvm だのといった仕組みとは違うってことだ。
Scoop ではメジャーバージョンが違うものは、違うアプリケーションとして管理している。例えば、
scoop install ruby
とすると、今なら 2.4.1-2 が入るし
scoop install ruby19
とすれば、今なら 1.9.3-p551 が入る。
両方入れた時に、ruby
コマンドで実行されるバイナリを切り替えるには、 scoop reset
というサブコマンドが用意されているので、それを使って切り替えればいい。詳細は公式マニュアルを見て欲しい。
細かいバージョンの差異に伴う再現テストなんて、ローカルでやらずに CI サーバでマトリックステストすれば良くない?僕としては、そういう気持ちです。
ちなみに、scoop を使えば、みんなが大好きな anaconda もコマンド一発でインストールできるよ。僕は使わんけど。
さぁ、Scoop を使おう
Scoop のインストール
こんな所まで長文を読んだって事は、Scoop を使おうって気になったってことだろうから、Scoop をインストールしてみよう。
Powershell3 以上の環境で、こういうコマンドを実行する。Chocolatey のインストールと大体一緒だよね。
iex (new-object net.webclient).downloadstring('https://get.scoop.sh')
エラーが出てインストールできないなら、こういうコマンドで、ExecutionPolicy を少し緩めて欲しい。
Set-ExecutionPolicy RemoteSigned -scope CurrentUser
これで、scoop
コマンドが実行できるようになった。
Scoop でアプリケーションをインストール
じゃあ、試しに node でもインストールしてみようか。その前に、Scoop のバケットを検索してみよう。
scoop search node
今の時点では、こういう感じの出力がなされる。
'main' bucket:
eventstore (4.0.2) --> includes 'EventStore.ClusterNode.exe'
nodejs-lts (6.11.3)
nodejs (8.5.0)
sliksvn (1.9.7) --> includes 'svn-populate-node-origins-index.exe'
あなたは最新の node をガンガン使って行く Node ジャンキーだろうか?それとも、しっかりと動作する LTS 版を好むタイプだろうか?
僕は、もちろん Node ジャンキーなので、最新版の nodejs を使いたい。こういうコマンドを入力しよう。
scoop install nodejs
こういう感じの出力がなされて、最新版の nodejs がインストールされた。
Installing 'nodejs' (8.5.0).
node-v8.5.0-win-x64.7z (8.7 MB) [=============================================================================] 100%
Checking hash of node-v8.5.0-win-x64.7z... ok.
Extracting... done.
Linking ~\scoop\apps\nodejs\current => ~\scoop\apps\nodejs\8.5.0
Persisting bin
Persisting cache
Running post-install script...
'nodejs' (8.5.0) was installed successfully!
素晴らしい。
Scoop でアプリケーションをアンインストール
次は、アンインストールだ。今入れたばかりのアプリケーションを何でアンインストールするのかって?
それは、僕がインストールジャンキーだから、というのは冗談で単に説明のためだ。
予想できると思うけど、こういうコマンドでアンインストールできる。
scoop uninstall nodejs
こういう感じの出力がなされて、さっきインストールしたばかりの nodejs がきれいさっぱりいなくなった。
Uninstalling 'nodejs' (8.4.0).
Unlinking ~\scoop\apps\nodejs\current
Removing ~\scoop\apps\nodejs\current from your path.
Removing ~\scoop\apps\nodejs\current\bin from your path.
'nodejs' was uninstalled.