Edited at

Scoopを使ったWindows環境構築のススメ - Super!!

More than 1 year has passed since last update.

ネット上にあるWindowsの環境構築やソフト紹介の記事を見て、まず「クリック」という単語を見ないことはないと思います。

あまつさえエクスプローラー間でのドラッグアンドドロップに設定フォームへの入力をするだなんて……AnsibleやDockerがすでに浸透しきった昨今、果たしてこれ以上に異常かつ原始的なことが他にあるのだろうか?

……と、そんな反語表現をWindowsの環境設定のたびに考えているアナタのための記事になります。

なお内容があまりにも長くなりそうなので、以下の3記事に分割してお伝えする予定です。

総じて、マウスなしでの全環境構築の完遂を究極目標に、Scoopを主体として自動化できるものは自動化し楽をすることに主眼を置いた内容になります。

守章: Scoopの基礎、簡単なManifestの作成 ← 今回はこれ

破章: バージョン管理と自動アップデート

離章: Scoopを用いた環境構築する際の勘所

今回は主役であるScoopを自由に使いこなすための基礎知識を解説します。

もはやScoopの解説記事といっても過言ではありません。


Scoopとは

まずはScoopが何なのかについて述べておきましょう。

ScoopはCLI(黒背景に文字だけの画面)で操作できるアプリ自動導入&管理ツールです。

たとえば、Gitの導入について。

通常、WindowsでGitを導入する際はブラウザを開き、GitHubのGit For Windowsのリリースページにアクセスして、目的のexeファイルをダウンロードして、インストーラーの指示に従ってチェックボックスをポチポチして……とけっこうな手間がかかります。

しかし、Scoopが導入してあれば、


プロンプト

> scoop install git


たったこれだけでダウンロードとインストールにPATHの設定、Git-Bashのリンク作成までも自動でやってくれます!! しかもノークリック!! とっても便利!! 1

もちろんGitだけではなく、FireFoxにPHPやVim、変わり者としてはDTMソフトのReaperなんてのもあったりもします。ほとんどのエンジニアであれば素のScoopを使うだけで満足できるくらい網羅されています。

早い話、Windows版Homebrewと言っても過言ではないでしょう。

ちなみにこの手の話題では先発であるChocolateyも候補に出てきますが、私はほとんどの場合Scoopの利用を薦めています。

まず、Chocolateyが管理者権限を常に必要とするのに対し、Scoopはほとんどの場合、管理者権限を一切必要としません。

つまりChocolateyではなくScoopを使うことで、会社支給のPCやネットカフェにあるWindowsでも環境構築ができます。素晴らしいですね!!

またChocolateyとは違い、導入に必要なスクリプトを簡単に作成、任意の公開Gitリポジトリで管理&利用できるというのも美味しいポイントです。

前述の通りほとんどの人が必要としているアプリ情報はどちらにも潤沢に揃っていますが、その内部で動くスクリプトにバグがあったりちょっと挙動変更したい部分があった場合、Chocolateyはメンテナーの方に依頼して変更を待たないといけないので時間がかかる上にその修正がされる保証もありません。対してScoopは既存の情報を参考に5〜20行程度のファイルをサクっと自作してGitHubとかに公開することで対処ができます。

その他公式曰く、以下のメリットがあるとのこと。


開発環境に特化している

デフォルトでHOME直下にインストールされる

パスを汚染しない

NuGetを使わない

開発用途に特化している


なお「特定のバージョンをインストールすることができない」などがデメリットとして挙げられることがありますが、それについては次回以降の記事について話そうと思います。


Scoopを使ってみる

早速Scoopを試してみましょう。前述のGit導入コマンドを実行するための環境を整えます。

(いちおうPowerShellのバージョンが3.0以上という制約はありますが、Windows8以降もしくはアップデートをしているWindows7であれば問題はありません。)

まずはPowerShellを起動しましょう。Windowsキーでpowershellと入力してEnter押すだけです。

そして以下の2コマンドをコピペで入力します。


PowerShellプロンプト

PS: Set-ExecutionPolicy RemoteSigned -Scope CurrentUser -Force

PS: iex (New-Object net.webclient).downloadstring('https://get.scoop.sh')

上のコマンドSet-ExecutionPolicyはScoopやそのインストールスクリプトなどを実行できるようにするためのものです。

下のコマンドiex (new-object ...が実際のScoopインストールコマンドです。


インストールとアンインストール

上記のインストール処理が終わったら先ほど例示したGitを導入します。Scoopの利用にGitは不可欠同然なので、まだ入れていない方は実際に入れてみましょう。


プロンプト(ここからはPowerShellじゃなくてもOK)

> scoop install git


導入したGitを削除したい場合は以下のコマンドを実行。


プロンプト

> scoop uninstall git



Bucketの追加

このままでも開発環境を整えるには十分なのですが、それでも導入できる数は限られています。

そこでBucketと呼ばれるものを導入して利用可能なアプリを増やしてみましょう。

ここではFireFoxを例に出します。

FireFoxのパッケージ情報はextrasというBucketに格納されています。

いちおう現時点ではインストールができないことを確認するため、パッケージ検索をしてみましょう。scoop searchコマンドを使います。


プロンプト

scoop search firefox


見つからないことを確認したら、extras Bucketを追加してみましょう。Bucket関連の操作はscoop bucketコマンドを用います。


プロンプト

> scoop bucket add extras


これでextras Bucketが追加され、インストールできるアプリがぐんと増えました。scoop search firefoxを実行すればextras Bucketにfirefoxがあることも確認できます。

なおインストールをはじめとして各種コマンドは対象Bucketが異なっても基本的に変わりません。


プロンプト

> scoop install firefox

> scoop uninstall firefox

他にどんなBucketがあるのか気になる人は、scoop bucket knownを実行してみたり、awesome-scoopなんかを眺めてみるといいでしょう。後者ではインストールできるアプリも確認することができます。

ちなみに上記サイトにあるような他の人のBucket(Gitリポジトリ)を利用する場合はコマンドにおまけを足します。

例えば私の管理している日本人向けBucketを利用するならこんな感じ。ALIASの部分は各々好きな名前に変えてください。


プロンプト

> scoop bucket add ALIAS https://github.com/rkbk60/scoop-for-jp.git



アプリのアップデート

インストールしたアプリがバージョンアップしていた場合、更新するにはどうすればよいでしょう? Scoopなら簡単にできます。


プロンプト

> scoop update

> scoop update *

それぞれ上の文でscoop自体のアップデートを、下の文でインストールしたアプリすべてをアップデートを行います。とても簡単ですね。

個人的にはscoop update; scoop update *とセミコロンでつなげて一気に実行することをお薦めします。


以上で基本の利用法はおしまいです。他にもいくつかコマンドもありますが、通常の用法ではこれ以上のコマンドを覚える必要はないと思います。

気になる人はscoop helpコマンドの出力や、公式Wiki、他のScoop解説記事をご覧ください。

ここからは「自分の思うがままに」環境構築をするための解説になります。


独自のパッケージを作ってみる

先ほどScoopの優秀な点として、簡単なファイルを公開Gitリポジトリに置くことで利用できる、というものを挙げました。

ここからは実際に簡単なパッケージの定義ファイル(以降 Manifest 表記)を作ってみて、その驚くべき実力を体感してみましょう。

今回はCtrl2cap(CapsLockキーをCtrlキーに置き換えるアプリ)を題材にします。

なおここで語る内容は公式WikiのうちCreating an App ManifestApp Manifestsの一部を和訳し例を加えただけのものなので、英語が読める方はそちらもご覧ください。


事前準備 1 -- Bucketの作成

前述のextras Bucketもそうですが、Bucketの実態はGitリポジトリです。

後々公開することも考えて、予め適当なディレクトリに適当なリポジトリを作っておきましょう。

以降紹介するファイルはすべてこのリポジトリの直下にあるものとします。


事前準備 2 -- Manifestのデバッグ方法

ScoopはローカルにあるManifestファイルを用いてインストールする機能を持っています。

これを利用してManifestの開発をするとよいでしょう。

導入はscoop install path\to\target-manifestでOKです。

再実行するときはいったんscoop uninstall path\to\target-manifestを実行してからインストールをしてください。


(ほぼ)最小構成

それではManifestを作ってみましょう。

scoop install ctrl2capでとりあえず使えるようになる構成のManifestはこちらになります。


ctrl2cap.json

{

"version": "2.0",
"url": "http://download.sysinternals.com/files/Ctrl2Cap.zip",

"##": "ctrl2cap.exeへパスを通す",
"bin": "ctrl2cap.exe"
}


シンプル! シンプルです!! これにはPowerShell嫌いの方もにっこりしてくれることでしょう。

Scoopのパッケージ情報であるManifestは必要な情報だけをJSONに書き記すだけでOKなのです。

ちなみに各属性の内容はこちら。

version (必須)

インストールするアプリのバージョン。

url (必須)

ダウンロードするファイルのURL。

##

コメント用。処理には一切関与しません。

bin

ユーザーPATHで参照できるようにしたいファイル。文字列もしくはその配列で指定します。

1次元または2次元の文字列配列なら複数のファイルを対象にしたり、別名を付けてパスを通すことができます。

また上記例のようにurl属性で指定したファイルがzipなどの圧縮ファイルなら、それを展開した中身を選べます。


スタートメニューに表示させる

とりあえずManifestはできましたが、上記のものでは単に圧縮ファイルの中にあったctrl2cap.exeにパスが通っただけです。

Ctrl2capでキーの上書きをするには管理者権限で実行する必要があるため、わざわざプロンプトを開き直してコマンドを叩くのは面倒です。ここでは誰でも確実に管理者として実行できるように、スタートメニューを経由させましょう。


ctrl2cap.json

{

"version": "2.0",
"url": "http://download.sysinternals.com/files/Ctrl2Cap.zip",

"##": "ctrl2cap.exeへパスを通し、スタートメニューにも表示させる",
"bin": "ctrl2cap.exe",
"shortcuts": [
[
"ctrl2cap.exe",
"ctrl2cap"
]
],
"notes": [
"NOTE: まだキーの置換は完了していません!!",
"スタートメニューからctrl2capで検索、管理者権限で実行してください。"
]
}


新しくshortcuts属性を追加しました。これをつけることでスタートメニューにショートカットを追加することができます。

値は文字列の2次元配列で、最初の要素に実体ファイル名、次の要素にショートカットの名前を指定します。2

またどうやって起動・実行するのか知らせるために、notes属性も付け加えてみました。ここに指定した文字列配列はすべての処理が終了したときに表示されるため、ユーザーに伝えたいことがあればここに書いておくとよいでしょう。


自動で有効化させる

でもやっぱり、スタートメニューを経由するのは面倒です。せっかく自動化した意味がありません。

そこでmain Bucket(最初からあるBucket)に存在するsudoコマンドを用いて管理者権限による実行も自動でやらせましょう。


ctrl2cap.json

{

"version": "2.0",
"url": "http://download.sysinternals.com/files/Ctrl2Cap.zip",

"##": "自動でcapsをctrlに置き換える(要 管理者権限)",

"pre_install": {
"script": "scoop install sudo"
},
"installer": {
"script": [
"sudo $dir\\ctrl2cap.exe /install",
"if ($? == $false) {",
" Write-Host '===================================' -Foreground Red",
" Write-Host 'ctrl2capの実行に失敗しました。' -Foreground Red",
" Write-Host 'スタートメニューから再度起動してください。' -Foreground Red",
" Write-Host '===================================' -Foreground Red",
"}"
]
},

"bin": "ctrl2cap.exe",
"shortcuts": [
[
"ctrl2cap.exe",
"ctrl2cap"
]
]
}


pre_install属性、installer属性を加えてみました。それぞれインストール前に実行するスクリプト、インストーラーとして実行するスクリプトです。正しく言えば、中身のscript属性に文字列もしくはその配列を指定することで単行もしくは複数行のPowerShellスクリプトを実行できます。

またinstallerのスクリプト中で$dirという未定義の変数が使われていますが、これはScoop側で定義されている解凍された圧縮ファイルのディレクトリパスになります。このようなscript属性中で利用できる変数は他に、version属性と同じ値をもつ$versionなどがあります。

さてこれでsudoコマンドを確保しつつ、自動でキー置換ができるようになったはずです(未検証)

ただ、scoopを実行している最中に同じコマンドを発行しています……なんか嫌ですね。さらにこれでは依存関係があることがScoopに伝わらないという実用上の問題点もあります。

そこでpre_install属性のscoop install sudoに該当する処理を以下のように書き換えてみます。


ctrl2cap.json

{

"version": "2.0",
"url": "http://download.sysinternals.com/files/Ctrl2Cap.zip",

"##": "自動でcapsをctrlに置き換える(要 管理者権限)",

"depends": [
"sudo"
],
"installer": {
"script": [
"sudo $dir\\ctrl2cap.exe /install",
"if ($? == $false) {",
" Write-Host '===================================' -Foreground Red",
" Write-Host 'ctrl2capの実行に失敗しました。' -Foreground Red",
" Write-Host 'スタートメニューから再度起動してください。' -Foreground Red",
" Write-Host '===================================' -Foreground Red",
"}"
]
},

"bin": "ctrl2cap.exe",
"shortcuts": [
[
"ctrl2cap.exe",
"ctrl2cap"
]
]
}


依存関係を示すためのdepends属性にsudoを指定しました。これで確実に実行できるようになっただけでなく、scoop searchなどのコマンドで依存関係が分かるようになりました。


hashも明記しておこう

さて、これでほぼ完全に動作する(はずの)Manifestができましたが、ひとつ問題があります。

このままではインストールの際、「hashが設定されてないゾ」というWarningが発生して怒られてしまうのです。

ダウンロードがきちんと行われたことを保証するためにも、hash属性にhash値3を明記しておきましょう。


ctrl2cap.json

{

"version": "2.0",
"url": "http://download.sysinternals.com/files/Ctrl2Cap.zip",
"hash": "2d8c06374da140beda79ac1940ab2b06a56a9af182dba70a6338313d768a2ac2",

"##": "(depends ~ shortcutsは省略しています。)"
}


なおhash値の確認方法はここでは紹介しないため、各自調べてみてください。

いちおう、上記Warningが出たときにチェックサムを表示してくれる機能があるということだけ伝えておきます。


その他情報を書いておく

上記hash属性の追加でManifestとしては問題なく動くようになりました(きっと)

あとは公開するにあたってこれらの情報も書き加えておきましょう。

description

パッケージの概要を示す属性。簡潔に。

homepage

ホームページを示す属性。

license

アプリのライセンス。

"license": "MIT"のようにライセンス名を直接書いてもいいし、url属性をもったオブジェクトを当ててリポジトリのライセンスファイルURLを参照させるのもOK。


公開してBucketとして利用する

ここまでできたらManifestは完璧です。満を持してお好きなホスティングサービスにgit-pushしちゃいましょう。

これでscoop bucket add AwesomeBucket https://somewhere.com/your/bucket-repository.gitすれば1コマンドでCtrl2capを自動導入できるようになります!!


あとがき

ここまで、Scoopを使うメリット/基本的な使い方/バージョン更新を伴わないパッケージ(Manifest)の作り方を見ていただきました。お疲れ様です。

とくに後半の、簡単なJSON(と必要に応じてPowerShell)を書くだけで独自の自動構築が可能になる部分だけでも、かなりの時間的・労力的コストが削減できそうことがお分かりいただけたのではないでしょうか。

次回はKaoriYa版Vimなどを題材に、自動バージョン更新について書こうと思います。またScoopの解説記事です。

解りにくい点や間違い等ありましたら遠慮なくコメントしていただけると嬉しいです。





  1. Unixを常用する人には当たり前な話ですね。 



  2. 3番目および4番目にも役割が指定されています。詳しくはWiki参照。 



  3. デフォルトはsha256。sha1やMD5も利用可能の他、hashの書かれたURLを参照することもできます。