初めてのHomebrew Cask (+主要コマンド一覧表)

# 初めてのHomebrew Cask
先日色々あってMacBookのOSを初期化・再インストールをすることとなったので、
これを機にパッケージ管理を学んで自分でPCを買った時に環境の移行を簡単にしよう、と思いCaskを使い始めました。
Caskに関する記事は色々とあったのですが、自分用の備忘録も兼ねて情報をまとめて記事にしておきます。

※ 間違い等あればご指摘頂けると幸いです！

## Homebrew Caskとは？

パッケージ管理ツールである「Homebrew」の拡張機能で、MacのGUIアプリをコマンドでインストールできるツールです。
HomebrewがCUIアプリ用、CaskがGUIアプリ用の管理ツールといった認識で良いかと思います。

通常の手順でGUIアプリをインストールする場合だと
1. ブラウザでアプリを検索
2. アプリのディスクイメージをダウンロード
3. ディスクイメージをApplicationディレクトリへ移動
といった手順を踏む必要がありますが、Caskを使うことで1コマンドで上記手順を完了できます。

ちなみに"Cask"とは"樽"という意味で、ここではアプリのパッケージを指しているようです。

## Homebrew Caskの利点

以下の3つが主な利点かなと感じました。
1. GUIアプリのインストールがターミナルから1コマンドで完了する。
2. Cask経由でインストールしたアプリのアップデートをまとめて実行できる。
3. Cask経由でインストールしたアプリを一括で新環境や別のPCへインストールできる。

## 導入方法
これから最新のHomebrewを導入する方はCaskがHomebrew本体にオプションとして含まれているため、
別途Caskをインストールする必要はありません。(私がインストールした時点ではHomebrew 3.1.8でした)
Homebrewのインストール方法は[Homebrew公式](https://brew.sh/)のコマンドをターミナルへコピペして実行するだけでOKです。

※ 古いバージョンのHomebrewだとCask本体を別途インストールし
`brew cask install {CASK_NAME}`のようなコマンドで利用するする必要がありましたが、
[v2.6.0](https://brew.sh/2020/12/01/homebrew-2.6.0/)でその方法が非推奨となり、[v2.7.0](https://brew.sh/2020/12/21/homebrew-2.7.0/)からはHomebrewのオプションとして利用する方法へと変更となりました。

## 主要コマンド一覧表

`--cask`オプションを付与するとcaskの情報に絞って実行できるため、基本的には付与することをおすすめします。
(付与しない場合はformulaの情報も表示されます。)

| コマンド | 説明 |
|:-:|:-:|:-:|
| brew search (--cask) {CASK_NAME} | アプリの検索 |
| brew home (--cask) {CASK_NAME} | アプリのホームページを表示 
| brew info (--cask) {CASK_NAME} | アプリの情報を表示 |
| brew install (--cask) {CASK_NAME} | アプリのインストール |
| brew upgrade (--cask) | アプリのアップグレード |
| brew upgrade --cask --greedy | アプリの強制アップグレード |
| brew list (--cask) | インストール済みアプリのリスト表示 |
| brew uninstall (--cask) {CASK_NAME} | アプリのアンインストール |
| brew reinstall (--cask) {CAKS_NAME} | アプリの再インストール |
| brew bundle dump | Brewfileの作成 |
| brew bundle | Brewfileからアプリをインストール |

## 主要コマンド・使い方

### アプリの検索

#### コマンドで検索

```zsh
% brew search (--cask) {CASK_NAME}
``` 

<details><summary>実行サンプル (--cask無し)</summary><div>

```zsh
% brew search google
==> Formulae
aws-google-auth  google-go  google-sql-tool
~~~ 略 ~~~
==> Casks
google-ads-editor  google-photos-backup-and-sync
google-analytics-opt-out
~~~ 略 ~~~                                
```

</div>

<details><summary>実行サンプル (--cask有り)</summary><div>

```zsh
% brew search google
==> Casks
google-ads-editor  google-photos-backup-and-sync
google-analytics-opt-out
~~~ 略 ~~~                                
```

</div>

検索でヒットしたアプリが自分の求めているアプリか確証が持てない場合、下記コマンドでホームページを確認することができます。
(同名で別のアプリが存在したり、アプリ名にハイフンを含むかどうかで別アプリとなることもあるため怪しい場合は確認推奨です)

```zsh:
% brew home (--cask) {CASK_NAME}
``` 

例えば`brew home zoom`とするとブラウザが立ち上がり、
[https://www.zoom.us/](https://www.zoom.us/) へアクセスできます。

#### サイトで検索

Homebrew公式の検索ボックスから検索が可能です。
=> [Homebrew Formulae](https://formulae.brew.sh/)

### アプリの情報を確認

```zsh
% brew info (--cask) {CASK_NAME}
``` 

例えばzoomをインストールした後に`brew info zoom`をすると、インストール済みのバージョンや格納先の確認などができます。

<details><summary>実行サンプル</summary><div>

```zsh
% brew info zoom
zoom: 5.6.6.950
https://www.zoom.us/
/usr/local/Caskroom/zoom/5.6.6.950 (24.8MB)
From: https://github.com/Homebrew/homebrew-cask/blob/HEAD/Casks/zoom.rb
==> Name
Zoom.us
==> Description
Video communication and virtual meeting platform
==> Artifacts
Zoom.pkg (Pkg)
==> Analytics
install: 5,837 (30 days), 20,678 (90 days), 70,339 (365 days)
```

</div>

### アプリのインストール

```zsh
% brew install (--cask) {CASK_NAME}
``` 

(Homebrew 2.6.0以前は `brew cask install {CASK_NAME}`と表記していたコマンドと同義です。)

<details><summary>実行サンプル</summary><div>

```zsh

% brew install firefox
==> Downloading https://download-installer.cdn.mozilla.net/pub/firefox/releases/88.0.1/mac/ja-JP-mac/Firefox%20
######################################################################## 100.0%
==> Installing Cask firefox
==> Moving App 'Firefox.app' to '/Applications/Firefox.app'
🍺  firefox was successfully installed!

```

アプリのダウンロードが完了すると上記の通り、自動的にApplicationsディレクトリへアプリが移動されます。

</div>


### アプリのアップデート

#### アプリ内自動更新OFFのアプリをアップデート (推奨)

```zsh
% brew upgrade (--cask)
``` 

Caskでインストールしたアプリには自動アップデートのオプションがそれぞれ振られており、このコマンドでは `auto_update true(アプリ内自動アプデON)` のアプリ以外をバージョンアップを実行します。(VSCodeやChromeなどが自身で自動アプデするタイプのアプリ)

#### アプリのアップデート(全アプリ強制)

```zsh
% brew upgrade --cask --greedy
``` 

"貪欲な"といった意味を持つ `--greedy` オプションを付けることで、Cask経由でインストールしたアプリをすべてアップグレードすることができます。

※ バージョンのアップグレードは古いバージョンのアプリを一旦アンインストールし、新しいバージョンを再インストールすることで行われている。そのため常駐系のアプリはアップグレード後に再びアプリを起動して上げないといけなかったり、初回起動時にセキュリティ確認が復活したりするので、 `brew upgrade (--cask)` でアップグレードできないアプリについてはアプリ内でアップグレードするほうが良いかと思います。

<details><summary>実行サンプル</summary><div>

```zsh

% brew upgrade --cask --greedy
Updating Homebrew...
==> Auto-updated Homebrew!
Updated 2 taps (homebrew/core and homebrew/cask).
==> New Formulae
gitwatch          grepip            marp-cli          php-cs-fixer@2    proj@7            tbb@2020
==> Updated Formulae
Updated 243 formulae.
==> New Casks
android-commandlinetools             jidusm                               tint
instatus-out                         mambaforge
==> Updated Casks
Updated 75 casks

```

</div>

=> 参考: [Homebrew/homebrew-cask](https://github.com/Homebrew/homebrew-cask/blob/master/USAGE.md#updatingupgrading-casks)


### Caskでインストールしたアプリのリスト表示

```zsh
% brew list (--cask)
```

<details><summary>実行サンプル</summary><div>

```zsh

% brew list --cask
alfred                fuwari                sourcetree            zoom
coteditor             notion                spectacle
firefox               skitch                visual-studio-code

```

</div>

または `ls /usr/local/Caskroom` でも確認可能。

### アプリのアンインストール

```zsh
% brew uninstall (--cask) {CASK_NAME}
```

<details><summary>実行サンプル</summary><div>

```zsh
% brew uninstall cask
Uninstalling /usr/local/Cellar/zoom/5.6.6... (243 files, 24.8MB)
```

</div>

### アプリの再インストール

```zsh
% brew reinstall (--cask) {CAKS_NAME}
```

<details><summary>実行サンプル</summary><div>

```zsh
% brew reinstall --cask coteditor
==> Downloading
https://github.com/coteditor/CotEditor/releases/download/4.0.3/CotEditor_4.0.3.dmg
Already downloaded: /Users/username/Library/Caches/Homebrew/downloads/80652a9d0dbd023d3d80c9cfef62ecc60f4fc8ecfce904d89488a0252b1b2a76--CotEditor_4.0.3.dmg
==> Uninstalling Cask coteditor
==> Backing App 'CotEditor.app' up to '/usr/local/Caskroom/coteditor/4.0.3/CotEditor.app'
==> Removing App '/Applications/CotEditor.app'
==> Unlinking Binary '/usr/local/bin/cot'
==> Purging files for version 4.0.3 of Cask coteditor
==> Installing Cask coteditor
==> Moving App 'CotEditor.app' to '/Applications/CotEditor.app'
==> Linking Binary 'cot' to '/usr/local/bin/cot'
🍺  coteditor was successfully installed!
```

</div>

### 現在のインストール済みパッケージ情報を出力

```zsh
% brew bundle dump
```

実行するとカレントディレクトリに`Brewfile`が生成され、その中にHomebrew経由でインストールしたパッケージ情報が書き出されます。(tap, brew, cask, manなどhomebrew経由でのインストール情報が記載される)

### Brewfileからインストール

```zsh
% brew bundle
```

Brewfileがあるディレクトリで実行することで、Brewfileに記載されたパッケージの自動インストールが実行されます。

<details><summary>実行サンプル</summary><div>

例えば、以下のようなBrewfileを作成して実行してみます。

```txt:Brewfile
cask "keyboardcleantool"
cask "clipy"
```

```zsh
% brew bundle
Installing keyboardcleantool
Installing clipy
Homebrew Bundle complete! 2 Brewfile dependencies now installed.
```

こんな感じで、Brewfileに記載しているパッケージが順番にインストールされました！

</div>

## まとめ・感想
- Homebrew Caskは導入も利用もだいぶお手軽だと感じました。
- 業務でもチームで使う必須アプリのBrewfileを作成し管理することで、新規着任者へのセットアップ工数が減らせそう。
- １から情報をまとめる作業ってやっぱり大変だけど、その分勉強になりました。

## 今後やりたいこと

- caskでインストールしたアプリの自動アップグレード (brew upgradeの自動化)
- BrewfileをGit管理(dotfilesリポジトリの管理)