全Scoopコマンド解説 その１ ～使用頻度（高）～

# はじめに

Windows のインストーラー、Scoop のコマンド操作についてまとめてみました。

Scoop はいわゆるパッケージ管理ツールを行う CLI ツールで macOS でいう Homebrew 的な存在です。
実際に Homebrew にインスパイアされて開発されており、同系ツールである Chocolatey から移行するユーザも増えてきました。

ただ、そんな状況にもかかわらず、Scoop のコマンドについては[公式ドキュメント](https://github.com/lukesampson/scoop/wiki/Commands)でも「`scoop help`で詳細確認できます。」程度しか書かれておらず
help を表示してもコマンドによって説明の粒度にムラがあり、半分くらいは構文程度の情報しか記載されていないものもあります。

そのため、ソースコードベースにコマンドの仕様をまとめ、以下 3 つの記事に分けて解説を載せることにしました。
これでもっとユーザ数、増えてもらえれば幸い。

|      #       |                                                記事リンク                                                 | 使用頻度 | Scoop サブコマンド                                                   |
| :----------: | :-------------------------------------------------------------------------------------------------------: | :------: | :------------------------------------------------------------------- |
| 今回はココ → |                              全 Scoop コマンド解説 その１ ～使用頻度（高）～                              |    高    | help, search, bucket, install, list, info, status, update, uninstall |
|      -       | [全 Scoop コマンド解説 その２ ～使用頻度（中）～](https://qiita.com/nimzo6689/items/0fb3e918248866c2c23e) |    中    | home, cache, cleanup, hold, unhold, which, reset, checkup            |
|      -       | [全 Scoop コマンド解説 その３ ～使用頻度（低）～](https://qiita.com/nimzo6689/items/53c63439f56ccd2d38c1) |    低    | config, alias, create, depends, export, prefix, virustotal           |

※表中のサブコマンドの並びに沿って紹介していきます。

# 表記・用語について

解説中に使用している構文の表記方法や Scoop 用語については以下のようにしています。

| 構文の記号  | 説明                                                                                                                |
| :---------: | :------------------------------------------------------------------------------------------------------------------ |
|    [xxx]    | xxx は省略可能                                                                                                      |
|   \<xxx\>   | 任意の xxx 名。\<app\>なら任意の Scoop アプリ名。\<args\>なら任意の引数。\<command\>なら任意の Scoop サブコマンド名 |
|    regex    | 正規表現                                                                                                            |
| \<xxx\> ... | 任意の数の\<xxx\>が指定可能（＝可変長引数）                                                                         |

| Scoop 用語           | 説明                                                                                                                                                         |
| :------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Scoop アプリ         | Scoop でインストール可能なアプリ、または、インストール済みのアプリです。                                                                                     |
| Scoop Bucket         | 一連の Scoop アプリを保持するパッケージリポジトリです。<br>リモートとローカルとで存在し、デフォルトでは Main Bucket のみがローカルで使用可能となっています。 |
| マニフェストファイル | Scoop アプリのインストール方法やバージョン、ライセンスなどを記載したメタ情報ファイルです。                                                                   |

※ほかの Scoop 用語については本文中でその都度解説します。

# インストール方法

Scoop の[公式ページ](https://scoop.sh/)にある通りですが、念のためこちらでも記載しておきます。
以下、PowerShell コンソール上で実行してください。

前提条件としては`PowerShell 5`以上であることと、`.NET Framework 4.5`が必要となります。
こちらの条件が仮に不足していた環境でも以下のコマンドを実行すれば、
それらの警告とアップグレードするためのリンクが表示されるようになっているため、気にせず 2 行目まで実行してみましょう。

```powershell:インストール方法
Set-ExecutionPolicy RemoteSigned -scope CurrentUser
iex (new-object net.webclient).downloadstring('https://get.scoop.sh')

# Scoop自身が内部でgitを使用するため、gitにPATHが通っていない環境は以下のコマンドでインストールする必要があります。
# 既にgitにPATHが通っている環境だとしてもScoop管理に移行して常に最新バージョンを使うようにするのがおススメです。
scoop install git
```

# help

まずは help コマンドです。
こちらの存在さえ知っていれば、基本的な使い方は掴めます。

```powershell:構文
scoop help <command>
```

ヘルプを表示します。
`scoop help`でサブコマンドの一覧が表示され、`scoop help ${サブコマンド名}`でサブコマンド用のヘルプが表示されます。

```powershell:例
# Scoop全体のヘルプを表示
scoop help
#=>Usage: scoop <command> [<args>]
#=>
#=>Some useful commands are:
#=>
#=>alias       Manage scoop aliases
#=>bucket      Manage Scoop buckets
#=>...
#=>Type 'scoop help <command>' to get help for a specific command.

# 任意のサブコマンドのヘルプを表示
scoop help install
#=>Usage: scoop install <app> [options]
#=>
#=>e.g. The usual way to install an app (uses your local 'buckets'):
#=>     scoop install git
#=>...
```

ちなみに単純に`scoop help`で全体のヘルプを表示したい場合は`scoop`だけでも可能です。
また、help のエイリアス的な書き方で`scoop --help <command>`や`scoop /? <command>`としても同じ結果が得られます。

# search

インストール可能な Scoop アプリを検索するコマンドです。

```powershell:構文
scoop search [regex]
```

検索文字列である[regex]を指定しなければ、インストール可能な Scoop アプリが全て表示されます。
検索文字列である[regex]を指定すれば、以下のような条件で検索されます。

１．検索文字列に正規表現で一致するインストール可能な Scoop アプリ名があれば、その条件で一致した Scoop アプリを表示。
２．１で一致しなかった場合、インストール後に PATH を通す対象になっている実行ファイル名（拡張子除く）や
　　ショートカットファイル名で正規表現検索し、一致すればその Scoop アプリとファイル名を表示。
３．（１，２）で 1 件も一致しなかった場合、`scoop bucket known`で表示される Bucket（詳細は後述）内で
　　インストール可能な Scoop アプリ名で正規表現検索をし、一致した Scoop アプリを表示。
４．いずれの条件でもヒットしなかった場合は「No matches found.」を表示。

```powershell:例
# Scoop全体でインストール可能なアプリを表示
# 全部出してもあまり嬉しい時はないだろう。
scoop search
#=>'main' bucket:
#=>7zip (19.00)
#=>ack (3.0.1)
#=>acmesharp (0.9.1.326)
#=>...

# zipで検索
# Scoopアプリ名にzipが入っているものがヒットするほか、
# 最終的にPATHに通る実行ファイル名にもzipが入っていれば表示される。
scoop search zip
#=>7zip (19.00)
#=>busybox (3128-g241d4d4ac) --> includes 'bunzip2'
#=>bzip2 (1.0.7.0)
#=>gow (0.8.0) --> includes 'bunzip2.exe'
#=>gzip (1.3.12)
#=>lzip (1.20)
#=>unzip (6.00)
#=>zip (3.0)

# 正規表現で検索したい場合は`''`で囲むのがおススメ。
# 以下はPiriform社が提供しているユーティリティツールをOR検索している例。
scoop search 'ccleaner|recuva|defraggler|speccy'
#=>'extras' bucket:
#=>    ccleaner (5.59.7230)
#=>    defraggler (2.22.995)
#=>    recuva (1.53.1087)
#=>    speccy (1.32.740)
```

# bucket

Scoop Bucket の追加、一覧表示、削除を行うコマンドです。

Bucket とは、他のパッケージ管理ツールにおけるパッケージリポジトリ的な存在で
Scoop ではデフォルトで Main Bucket が登録されています。
Bucket を追加することで Main Bucket にはない Scoop アプリもインストールすることが可能となります。

Bucket についての詳細は[Scoop で利用できる Bucket ごとの解説（`scoop bucket known`限定）](https://qiita.com/nimzo6689/items/5ead753169dbad72e4eb)にてまとめました。
適宜、ご参照ください。

```powershell:構文
scoop bucket add|list|known|rm [<args>]
```

Bucket の操作は Scoop を導入して最初に行う際の設定を除いてはあまり使用機会はないコマンドなので、
以下の例でなんとなく使い方イメージできれば特に困ることはありません。

```powershell:例
# Scoopが公式的に推奨？しているBucketなどはkownで一覧表示できます。
scoop bucket known
#=>main
#=>extras
#=>versions
#=>...

# extras Bucketを追加
scoop bucket add extras
#=>Checking repo... ok
#=>The extras bucket was added successfully.

# knownで表示されるBucket以外を任意で追加したい場合はBucket名に加え、BucketのGitリポジトリとなるURLも必要となります。
scoop bucket add nimzo6689 'https://github.com/nimzo6689/Scoop-nimzo6689.git'
#=>Checking repo... ok
#=>The nimzo6689 bucket was added successfully.

# 追加したBucketはlistで確認可能です。
scoop bucket list
#=>extras
#=>main
#=>nimzo6689

# 不要になった場合は削除
scoop bucket rm nimzo6689
```

# install

Scoop アプリをインストールするコマンドです。

```powershell:構文
scoop install (<app> | <app> ...) [options]
```

構文にある通り、一度にインストールできるアプリは一つ、または、複数指定が可能です。

インストール可能な Scoop アプリは登録済みの Bucket 内にあるものに限られるため、
もしインストールしたい Scoop アプリがない場合は新たに Bucket を追加する必要があります。

また、いくつかの Scoop アプリでは install した際にユーザ環境変数（`PATH`の追加や`〇〇_HOME`の追加など）を
自動で更新する機能もありますが、更新された場合であっても PowerShell から実行している限り、
ターミナルの再起動不要で即現在のシェル環境に反映されます。

```powershell:例
# ccatをインストール
scoop install ccat
#=>Installing 'ccat' (1.1.0) [64bit]
#=>windows-amd64-1.1.0.tar.gz (1.2 MB) [=================================================] 100%
#=>Checking hash of windows-amd64-1.1.0.tar.gz ... ok.
#=>Extracting windows-amd64-1.1.0.tar.gz ... done.
#=>Linking ~\scoop\apps\ccat\current => ~\scoop\apps\ccat\1.1.0
#=>Creating shim for 'ccat'.
#=>'ccat' (1.1.0) was installed successfully!

# ちなみにccatはColorizing `cat`を意味しており、以下のようにシンタックスハイライトを効かせてコードを表示できます。
ccat "$env:USERPROFILE\scoop\apps\ccat\current\manifest.json"
#=>jsonがカラーで表示される。

# マニフェストファイルのURLを指定することでもインストール可能です。
scoop install https://raw.githubusercontent.com/user/repo/branch/path/to/app.json
#=>...

# ローカル内にあるマニフェストファイルもパスを指定してのインストールができます。
scoop install .\path\to\app.json
#=>...
```

また、install コマンドでは以下のオプションも使用可能です。各オプションの詳細は割愛します。

| ショートオプション | ロングオプション          | 説明                                                                                                                       |
| :----------------: | :------------------------ | :------------------------------------------------------------------------------------------------------------------------- |
|         -g         | --global                  | グローバルなパス（例えば、C:\Scoop など）に Scoop アプリをインストールする。                                               |
|         -i         | --independent             | 依存性があった場合、自動的に依存しているアプリもインストールしない                                                         |
|         -k         | --no-cache                | インストールする際、キャッシュを使用せずに再度インストーラーをダウンロードしなおす                                         |
|         -s         | --skip                    | ハッシュ値の検証をスキップする（実施する場合は、慎重に行うこと）                                                           |
|         -a         | --arch \<32bit or 64bit\> | アーキテクチャを指定してインストールを行う（Scoop アプリがアーキテクチャごとのインストールをサポートしていた場合のみ有効） |

# list

インストールした Scoop アプリを表示するコマンドです。

```powershell:構文
scoop list [regex]
```

引数で正規表現を指定することにより、その正規表現にマッチする Scoop アプリ名のみ表示できます。

また、インストールが失敗している Scoop アプリがあった場合は一番下の失敗リストに表示されるため、
正常にインストールできたかの確認としても使えます。

```powershell:例
# インストール済みの全Scoopアプリを表示
scoop list
#=>Installed apps:
#=>
#=>7zip 19.00
#=>apache 2.4.39
#=>...

# pythonにマッチするインストール済みのScoopアプリを表示
scoop list python
#=>Installed apps matching 'python':
#=>
#=>  python 3.7.3
#=>  python27 2.7.16 [versions]
```

# info

Scoop アプリの詳細を確認するためのコマンドです。

```powershell:構文
scoop info (<app> | <url>)
```

表示される情報はマニフェストファイルから取得してきており、以下の内容が確認可能です。

| 項目名      | 説明                                                                                                                                                                       |
| :---------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Name        | Scoop アプリ名                                                                                                                                                             |
| Description | Scoop アプリの説明                                                                                                                                                         |
| Version     | バージョン                                                                                                                                                                 |
| Website     | ホームページの URL                                                                                                                                                         |
| License     | ライセンス                                                                                                                                                                 |
| Manifest    | マニフェストファイルのフルパス                                                                                                                                             |
| Installed   | インストール先のパス<br><br>※インストールされていないアプリの場合は「No」と表示される）<br>※複数のバージョンがインストールされているときはそれらのフルパスが全て表示される |
| Binaries    | PATH を通している実行ファイル（git であれば、git.exe gitk.exe git-gui.exe tig.exe git-bash.exe）                                                                           |
| Environment | 設定される環境変数                                                                                                                                                         |
| Notes       | 備考                                                                                                                                                                       |

```powershell:例
# gitの情報を出力
scoop info git
#=>Name: git
#=>Version: 2.22.0.windows.1
#=>Website: https://git-for-windows.github.io/
#=>License: GPL-2.0 (https://spdx.org/licenses/GPL-2.0.html)
#=>Manifest:
#=>  C:\Users\xxxxx\scoop\buckets\main\bucket\git.json
#=>Installed:
#=>  C:\Users\xxxxx\scoop\apps\git\2.21.0.windows.1
#=>  C:\Users\xxxxx\scoop\apps\git\2.22.0.windows.1
#=>Binaries:
#=>   cmd\git.exe cmd\gitk.exe cmd\git-gui.exe usr\bin\tig.exe git-bash.exe
#=>Environment:
#=>  GIT_INSTALL_ROOT=C:\Users\xxxxx\scoop\apps\git\current
#=>Notes
#=>-----
#=>To get Git to recognise OpenSSH, you will need to run
#=>
#=>scoop install openssh
#=>[environment]::setenvironmentvariable('GIT_SSH', (resolve-path (scoop which ssh)), 'USER')

# ScoopのマニフェストファイルのURLを指定することでも表示可能。
# 使用する機会は稀。
scoop info https://raw.githubusercontent.com/user/repo/branch/path/to/app.json
#=>...
```

# status

Scoop 全体のステータスを確認するためのコマンドです。

```powershell:構文
scoop status
```

確認できるステータスは以下の 5 項目です。
表示するメッセージがないステータス項目はスキップされます。
そのため、通常時は「Updates are available for:」ぐらいしか表示されません。

表示するメッセージが 1 件もなければ、「Everything is ok!」と出ます。

| ステータス項目                         | 説明                                                                                                                                |
| :------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------- |
| Updates are available for:             | 更新可能な Scoop アプリ                                                                                                             |
| These apps are outdated and on hold:   | 更新可能ですが、hold 中の Scoop アプリ<br>※hold については次の記事にて解説します                                                    |
| These app manifests have been removed: | マニフェストファイルが削除された Scoop アプリ<br>※Bucket から削除された、もしくは、Scoop アプリ名のリネームされた場合に表示されます |
| These apps failed to install:          | インストールが失敗している Scoop アプリ                                                                                             |
| Missing runtime dependencies:          | あるインストール済みの Scoop アプリに依存されている未インストールの Scoop アプリ                                                    |

```powershell:例
scoop status
#=>Scoop is up to date.
#=>Updates are available for:
#=>    gradle: 5.4 -> 5.5
#=>    mysql: 8.0.15 -> 8.0.16
```

# update

Scoop、または、Scoop アプリを最新のバージョンに更新するコマンドです。

```powershell:構文
scoop update [* | <app> | <app> ...] [options]
```

`scoop update`で Scoop 自身を更新し、`scoop update <app>`でインストール済みの Scoop アプリの最新バージョンをインストールします。
update コマンドの引数は複数の Scoop アプリ名を指定できる他、`*`を使用することによりインストール済みの全ての Scoop アプリの中から
バージョンが最新でなくなっている Scoop アプリを全て更新することができます。

```powershell:例
# Scoop自身を更新するコマンドです。
# Scoopの新機能、バグ修正のほか、Scoopが管理しているScoopアプリ情報も更新されます。
scoop update
#=>Updating Scoop...
#=>Updating 'extras' bucket...
#=> * cb9b7a09 opera: Update to version 62.0.3331.43                        27 minutes ago
#=>Updating 'main' bucket...
#=> * 1596ee2d nodejs: Update to version 12.6.0                             29 minutes ago
#=> * 0bb23438 jx: Update to version 2.0.398                                29 minutes ago
#=>Scoop was updated successfully!

# アプリを指定して更新
scoop update vscode
#=>vscode: 1.35.1 -> 1.36.0
#=>Updating one outdated app:
#=>Updating 'vscode' (1.35.1 -> 1.36.0)
#=>Downloading new version
#=>...
#=>'vscode' (1.36.0) was installed successfully!
#=>Notes
#=>-----
#=>Add Visual Studio Code as a context menu option by running: "C:\Users\xxxxx\scoop\apps\vscode\current\vscode-install-context.reg"
```

また、update コマンドでは以下のオプションも指定可能です。詳細は割愛します。

| ショートオプション | ロングオプション | 説明                                                                               |
| :----------------: | :--------------- | :--------------------------------------------------------------------------------- |
|         -g         | --global         | グローバルなパス（例えば、C:\Scoop など）に Scoop アプリをインストールする。       |
|         -i         | --independent    | 依存性があった場合、自動的に依存しているアプリもインストールしない                 |
|         -k         | --no-cache       | インストールする際、キャッシュを使用せずに再度インストーラーをダウンロードしなおす |
|         -s         | --skip           | ハッシュ値の検証をスキップする（実施する場合は、慎重に行うこと）                   |
|         -f         | --force          | 新しいバージョンが更新されていなくても強制的に更新する。                           |
|         -q         | --quiet          | 無関係なメッセージを非表示にする。                                                 |

# uninstall

Scoop アプリをアンインストールするコマンドです。

```powershell:構文
scoop uninstall (<app> | <app> ...) [options]
```

使用感は install コマンドと同様です。

```powershell:例
scoop uninstall php56
#=>Uninstalling 'php56' (5.6.40).
#=>WARN  Shim for 'php' is missing. Skipping.
#=>Unlinking ~\scoop\apps\php56\current
#=>'php56' was uninstalled.
```

また、update コマンドでは以下のオプションも使用可能です。

| ショートオプション | ロングオプション | 説明                                                                         |
| :----------------: | :--------------- | :--------------------------------------------------------------------------- |
|         -g         | --global         | グローバルにインストールされた Scoop アプリを削除する。                      |
|         -p         | --purge          | 永続化されたデータ（バージョン間で共有される設定ファイルなど）も全て削除する |

# おわりに

初回のコマンド解説は以上となります。

これまで紹介したコマンドが使えれば普段使いで Scoop でのアプリ管理が十分可能だと思います。
「もっと使いこなしたい」や「もっと便利な方法を知りたい」などあれば、その２以降の記事もご覧ください。