WindowsコマンドラインツールScoopのすすめ（基礎編）

## 前提
この記事は下記のような方にお勧めします。

- WindowsUpdateが適用されているWindows10で開発を行っている
- PowerShellもちょっと興味がある
- ツールのインストールが面倒に感じる

## "Scoop"というツール
Windowsで開発をなさっている皆さん、"Scoop"というコマンドラインツールをご存知ですか？

Windowsでも開発時にはコマンドラインのツールを使う場面が出てきますが、Windows上ではブラウザからGitHubなどの公式サイトを検索して、インストーラーやZipをダウンロードしてドキュメントの通りにパスや環境変数を設定して…と非常に手間がかかります。それを解決する手段として有力なのが、"[Scoop](https://github.com/lukesampson/scoop/wiki)"というツールです。

"Scoop"はWinndows上でDebianのapt-getやRedHatのyumのようなパッケージ管理を行おう、というツールです。[^1]
[^1]: 公式サイトではコマンドラインインストーラーと名乗っていて、パッケージ管理ツールという紹介の仕方はしていません。

例えばGitをインストールする場合、コマンドプロンプトまたはPowerShellのコンソールから、`scoop install git`と入力するだけでダウンロードからインストール、標準的な初期設定を完了してくれます。

ふと普段は使わないツールが必要になったとき、この手軽さは非常に捗ります。

## すぐに使いたい人のためのScoopインストール
ScoopのインストールはPowerShellのスクリプトを使用します。
Windowsキーでスタートメニューを出して、PowerShellを起動します。[^2]
[^2]: よく使うようになると思いますので「スタートにピン留めする」しておきます

プロンプトが表示されたら、以下のように入力してみます。

```powershell

iex (new-object net.webclient).downloadstring('https://get.scoop.sh')
```

これだけでダウンロードとインストールが行われます。
何やら警告が表示される場合[^3]は、以下のコマンドを実行します。

[^3]: PoweShellのデフォルトではスクリプトを実行できないようになっているため、過去に設定を変更していない限り警告が出るはずです。

```powershell

# スクリプトを実行できるようにする
set-executionpolicy remotesigned -scope CurrentUser
```

このコマンドはPowerShellのスクリプトの実行権限を変更します。[こちらの記事](https://qiita.com/kikuchi/items/59f219eae2a172880ba6)が詳しいので、参照してみてください。
確認プロンプト表示されますので、`y`を押してからもう一度、前述のコマンドを実行します。

## こだわりのある人のScoopのインストールのオプション
### Scoopと管理されているアプリのインストール場所
上記のデフォルトではScoop本体とアプリはC:\Users\ユーザー名\scoopにインストールされます。インストール前にあらかじめ指定しておくことで、他の場所にインストールすることも可能です。

```powershell

#code内の角括弧をエスケープしようとしたらバックスラッシュが必要でした。
#本来のコマンドでは行頭のバックスラッシュは必要ありません。
\[environment]::setEnvironmentVariable('SCOOP','D:\Applications\Scoop','User')
$env:SCOOP='D:\Applications\Scoop'
iex (new-object net.webclient).downloadstring('https://get.scoop.sh')
```
環境変数にパスを指定することで、Scoopのインストール場所を変更しています。


## 基本的な使い方
コマンドプロンプトからもPowershellからも利用できますが、コンソールの使いやすさからPowerShellを利用するのがおすすめです。
基本的には`scoop コマンド名 オプション`の構文で使用します。
例えば、最新版のGitをインストールしたい場合は以下の一文で完了します。

```powershell
PS C:\Users\user> scoop install git
```
これだけでもScoopが便利なのは実感できますが、Scoopで名前だけ知っているアプリをインストールするような場合を想定して、コマンドを流れにそって説明していきます。

### ヘルプコマンド
`scoop help`で以下のようにヘルプを表示できます。

```powershell
PS C:\Users\user> scoop help
Usage: scoop <command> [<args>]

Some useful commands are:

alias       Manage scoop aliases
bucket      Manage Scoop buckets
cache       Show or clear the download cache
checkup     Check for potential problems
cleanup     Cleanup apps by removing old versions
config      Get or set configuration values
create      Create a custom app manifest
depends     List dependencies for an app
export      Exports (an importable) list of installed apps
help        Show help for a command
home        Opens the app homepage
info        Display information about an app
install     Install apps
list        List installed apps
prefix      Returns the path to the specified app
reset       Reset an app to resolve conflicts
search      Search available apps
status      Show status and check for new app versions
uninstall   Uninstall an app
update      Update apps, or Scoop itself
virustotal  Look for app's hash on virustotal.com
which       Locate a shim/executable (similar to 'which' on Linux)


Type 'scoop help <command>' to get help for a specific command.
```
最後に表示されているように[^4]、各コマンドのヘルプも表示できます。
[^4]: 詳細というほど詳しくないので[ドキュメント](https://github.com/lukesampson/scoop/wiki)の参照をお勧めします。

### アプリケーションの検索
`scoop search アプリ名`でScoopが対応しているアプリを検索できます。部分一致で検索され、所属するバケットも表示されます。
例えば`scoop search ssh`を実行すると以下のような結果が得られます。

```powershell
PS C:\Users\user> scoop search ssh
'extras' bucket:
    processhacker (2.39)
    winsshterm (2.5.2)

'main' bucket:
    git-with-openssh (2.21.0.windows.1)
    gow (0.8.0) --> includes 'ssh.bat'
    mls-software-openssh (8.0p1-2)
    openssh (7.6p1)
    ssh-copy-id (2015-03-22)
    win32-openssh (7.9.0.0p1-Beta)
```
'extras'バケットに2種、'main'バケットにいくつか、見知った名前が並びます。
「バケット」については後述します。

### アプリケーションの情報表示
`scoop info アプリ名`でアプリの情報が表示できます。
例として`scoop info openssh`は以下のように表示されます。

```powershell
PS C:\Users\user> scoop info openssh
Name: openssh
Version: 7.6p1
Website: https://www.openssh.com/
License: ISC (https://spdx.org/licenses/ISC.html)
Manifest:
  C:\Users\user\scoop\buckets\main\bucket\openssh.json
Installed: No
Binaries:
   findssl.sh.exe usr/bin/scp.exe usr/bin/sftp.exe usr/bin/ssh.exe usr/bin/ssh-add.exe usr/bin/ssh-agent.exe ssh-copy-id.exe usr/bin/ssh-keygen.exe usr/bin/ssh-keyscan.exe usr/bin/sshd.exe
```
公式サイトのアドレスやライセンス、同梱されるバイナリの一覧など、目的のアプリの情報が確認できます。
公式サイトのアドレスが表示されるのが個人的にはうれしい機能です。インストール済みのアプリの場合は`Installed:`にインストールされたフォルダが表示されます。

### アプリのインストール
前述のように、`scoop install アプリ名`でアプリをインストールすることができます。アプリに他のアプリへの依存性がある場合、それもダウンロードしてインストールしてくれます。

### インストールされたアプリの一覧
`scoop list`で、Scoopを通じてインストールされたアプリの一覧を見ることができます。

```powershell
PS C:\Users\user> scoop list
Installed apps:

  7zip 19.00
  curl 7.64.0_2
  git 2.21.0.windows.1
  vagrant 2.2.4
  vim 8.1.0540
```

### インストールされたアプリのアップデート
インストールされているアプリをアップデートするためには、`scoop update`で、Scoop自体を更新します。このとき、Scoopに登録されているアプリケーションのリポジトリーである「バケット」も更新されます。
以下は、`scoop update`を実行したときの例です。

```powershell
PS C:\Users\user> scoop update
Updating Scoop...
Updating 'main' bucket...
 * 0b8f15e7 ant: Update to version 1.10.6                                2 hours ago
 * f461df00 jx: Update to version 2.0.100                                3 hours ago
 * f819e81b just: Update to version 0.4.3                                7 hours ago
 * 63a1e423 force: Update to version 0.26.3                              11 hours ago
 * 35786e27 aws: Update to version 1.16.154                              13 hours ago
 * 058470df nodejs: Update to version 12.2.0                             15 hours ago
 * a8fc75f0 fnproject: Update to version 0.5.77                          15 hours ago
 * cd197c23 bazel: Update to version 0.25.1                              15 hours ago
 * ff61bf2b jx: Update to version 2.0.99                                 16 hours ago
 * a3ebb585 git-annex: Update to version 7.20190507                      16 hours ago
 * b3f8344c jx: Update to version 2.0.98                                 17 hours ago
 * 14469baf jx: Update to version 2.0.97                                 18 hours ago
 * 29a73fe6 jx: Update to version 2.0.96                                 19 hours ago
 * caa45066 ngrok: hash fix close #37 close #38                          19 hours ago
 * 8ce8b4e0 exiftool: Update to version 11.40                            20 hours ago
 * 187bee7b jx: Update to version 2.0.95                                 22 hours ago
 * 1951e061 ffmpeg-nightly: Update to version 20190507-e25bddf           24 hours ago
 * 9d36936b jx: Update to version 2.0.93                                 25 hours ago
Scoop was updated successfully!
```

続けて、`scoop status`で、インストールされているアプリの更新を確認します。[^5]
[^5]: 必須の手順ではありませんが、`scoop update`のログから探すよりも楽だと思います。
下記の場合であれば、curlとvimが更新可能です。

```powershell
PS C:\Users\user> scoop status
Scoop is up to date.
Updates are available for:
    curl: 7.64.0_2 -> 7.64.1_1
    vim: 8.1.0540 -> 8.1.1286
Everything is ok!
```

更新できるアプリが確認できたら、`scoop update アプリ名`でアプリをアップデートします。
とりあえずすべてのアプリをアップデートしたい場合には、`scoop update *`という使用法もあります。

### アプリをアンインストールする
`scoop uninstall アプリ名`でインストールされたアプリをアンインストールできます。
Scoop自体をアンインストールするときも、`scoop uninstall scoop`です。

### バケットについて
「バケット」はScoopで利用できるアプリを分類したリポジトリーです。初期状態では'main'バケットのみが利用可能となっています。もしも利用したいアプリが'main'バケットに存在しない場合には、`scoop bucket add バケット名`で別のバケットを追加できます。
Scoopコミュニティで管理されているバケットは[buckets.json]か、`scoop bucket known`コマンドから確認できます。
残念ながら、登録されているアプリを事前に知りたい場合には、今のところ[buckets.json]からそれぞれのリポジトリのbucketフォルダを確認するしかないようです。とはいえ、おおよそのアプリケーションは'extras'バケットを追加すれば見つけることができると思います。
[buckets.json]:https://github.com/lukesampson/scoop/blob/master/buckets.json

## 最後に
これで基本的なScoopの使用法は紹介できたかと思います。
コマンドラインだけで数多くのアプリのインストールを完了できるようになるのは魅力的です。また、Scoopでアプリを管理するときの肝となる「[バージョン管理編](https://qiita.com/talesleaves/items/88d9efea22912cf3ef8b)」を公開 ~~したいと考えています。~~ しました。