メインコンテンツまでスキップ

ScoopでWindowsにおける開発環境構築を最適化しよう

Sato Taichi
yak shaver

はじめに

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.

キマるぜぇ!!

Scoop で複数バージョンをインストールしたい

どうしてもローカルに複数バージョンのアプリケーションをインストールしたいって呪われた性癖を持つ人はいると思う。

そういうあなたには、versionsバケットというものが用意されている。こういうコマンドを実行すると、最新版ではないアプリケーションの情報を検索できるようになる。

scoop bucket add versions

これで、もう一度 node を検索してみよう。

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'

'versions' bucket:
nodejs010 (0.10.48)
nodejs012 (0.12.18)
nodejs4 (4.8.4)
nodejs6 (6.11.3)
nodejs7 (7.10.1)
nodejs8 (8.5.0)

安心してくれ。どのメジャーバージョンでもコマンド一発で最新版が入れ放題だ!

もっと Scoop を知りたい!

公式の Wiki を見てほしい。すごく丁寧にドキュメントが書かれていて、知りたい事はなんでも分かるようになっている。

まとめ

僕は、かなり Linux 文化に染まっているとは言え、GNU 信者ではないのでゲームができない Linux デスクトップを使ったりはしない。普通の Windows ユーザだ。

なので、Bash on Windows に喜んだりする一方で、ある程度は PowerShell を使って作業したい。

とはいえ、いくら設計に優れていても、ややこしいだけのものを我慢して使いたくはない。

こういう気持ちに同調してくれる Windows ユーザは多い筈だ。コマンドラインベースで、開発環境のセットアップを自動化したいが、どうもしっくりこないって人は多いんじゃないかな。

そういうあなたは、是非 Scoop を試してみて欲しい。