今さらだけどHomebrewのコマンドをちゃんと理解して使おう

# はじめに
本稿は、今さらではありますが...
分かってるようで実はわかってない？
Homebrewの各コマンドの意味について
復習がてら整理していきます:writing_hand:



# Homebrewとは？

#### 参考wiki
https://ja.wikipedia.org/wiki/Homebrew_(%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E7%AE%A1%E7%90%86%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0)


# Homebrewの各コマンドの概要を整理する

#### (アン)インストール系
- brew install
- brew uninstall

#### 一覧にインストール済みパッケージを表示する
- brew list

#### 各ツールの起動状況確認
- brew services list

#### brew関連の問題検出したい
- brew doctor

#### brewに関わるローカルの情報を確認したい
- brew --config

#### アップデート系
- brew update
- brew upgrade

#### brewでインストールしたパッケージのバージョンを知りたい
- brew info パッケージ名

#### パッケージのバージョンを切り替えたい
- brew switch パッケージ名 バージョン

#### ゴミデータを消してローカルPCの空き容量を増やしたい
- brew cleanup

## brew install

- パッケージをインストールする

```ruby
$ brew install vim
```

## brew uninstall

- パッケージをアンインストールする

```ruby
$ brew uninstall vim
```

## brew list

- これまで `brew install` したものを一覧で表示する

```ruby
$ brew list
autoconf		imagemagick		nodebrew		redis
awscli			jpeg			openssl			ruby
fish			libtiff			perl			sqlite
fontconfig		libtool			phantomjs		tig
freetype		libxml2			pkg-config		vim
gd			    libyaml		    postgresql		webp
gdbm			mongodb		    python			xz
graphviz		mysql			python3			yarn
htop			nkf             rbenv
icu4c			node			readline
```

## brew services list

- brewのパッケージの起動状況を一覧で表示する
- `started` になって入れば無事に起動している状態

```ruby
$ brew services list
Name              Status  User     Plist
elasticsearch     started ユーザー名 /Users/ユーザー名/Library/LaunchAgents/homebrew.mxcl.elasticsearch.plist
mongodb           started ユーザー名 /Users/ユーザー名/Library/LaunchAgents/homebrew.mxcl.mongodb.plist
mysql             stopped
postgresql        started ユーザー名 /Users/ユーザー名/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
redis             started ユーザー名 /Users/ユーザー名/Library/LaunchAgents/homebrew.mxcl.redis.plist
```

## brew doctor

- brew installに関わる諸問題を検出してくれる

```rb
$ brew doctor # 実行結果の例

Please note that these warnings are just used to help the Homebrew maintainers
with debugging if you file an issue. If everything you use Homebrew for is
working fine: please don't worry or file an issue; just ignore this. Thanks!

Warning: Unbrewed dylibs were found in /usr/local/lib.
If you didn't put them there on purpose they could cause problems when
building Homebrew formulae, and may need to be deleted.

Unexpected dylibs:
  /usr/local/lib/libwkhtmltox.0.12.5.dylib

Warning: Unbrewed header files were found in /usr/local/include.
If you didn't put them there on purpose they could cause problems when
building Homebrew formulae, and may need to be deleted.
```

## brew --config

- Homebrewに関わるローカルの設定を確認する

```ruby
$ brew --config
HOMEBREW_VERSION: 1.8.0
ORIGIN: https://github.com/Homebrew/brew
HEAD: fdd8e9b7cf1e53322492e1e90f685c19bdfde506
Last commit: 9 days ago
Core tap ORIGIN: https://github.com/Homebrew/homebrew-core
Core tap HEAD: b7bc467b9e1cc8ba4a43cd355d1a6ca16999f0b6
Core tap last commit: 14 hours ago
HOMEBREW_PREFIX: /usr/local
CPU: quad-core 64-bit kabylake
Homebrew Ruby: 2.3.7 => /System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/bin/ruby
Clang: 10.0 build 1000
Git: 2.17.1 => /Applications/Xcode.app/Contents/Developer/usr/bin/git
Curl: 7.54.0 => /usr/bin/curl
Java: 1.8.0_181
macOS: 10.13.6-x86_64
CLT: 10.0.0.0.1.1535735448
Xcode: 10.0
```

## brew update

HomebrewのFormulaeとHomebrew自体をアップデートしてくれる

※ `formulae` とはHomebrewにおけるビルド方法・手順が書かれたスクリプトのこと

```ruby
$ brew update
To restore the stashed changes to /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core run:
  'cd /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core && git stash pop'
Updated 3 taps (homebrew/cask-versions, homebrew/core and homebrew/cask).
==> Updated Formulae
vim ✔asciidoc            bzt                 hugo                ipython             presto       　tox                 wireguard-tools
advancemame         beast               circleci            imageworsener       kakoune             pwntools            vips                xmrig
app-engine-java     binutils            fd                  imapfilter          platformio          skafos              whois               youtube-dl
```

## brew upgrade

- インストールしたパッケージをアップデートしてくれる(更新があるパッケージを再ビルド)

```ruby
$ brew upgrade awscli
Updating Homebrew...
==> Upgrading 1 outdated package:
awscli 1.14.10 -> 1.16.40
==> Upgrading awscli
==> Downloading https://homebrew.bintray.com/bottles/awscli-1.16.40.high_sierra.bottle.tar.gz
######################################################################## 100.0%
==> Pouring awscli-1.16.40.high_sierra.bottle.tar.gz
==> Caveats
The "examples" directory has been installed to:
  /usr/local/share/awscli/examples

Bash completion has been installed to:
  /usr/local/etc/bash_completion.d

zsh completions and functions have been installed to:
  /usr/local/share/zsh/site-functions
==> Summary
🍺  /usr/local/Cellar/awscli/1.16.40: 4,832 files, 43.9MB
```

## brew info

- インストールされているパッケージのバージョンなどの情報が知りたいとき

```ruby
$ brew info nodebrew
```

## brew switch

- インストールされているツールの複数のバージョンを切り替えたい時
- brew infoとセットで使えば良い

```ruby
$ brew info libyaml
libyaml: stable 0.2.1 (bottled)
YAML Parser
https://github.com/yaml/libyaml
/usr/local/Cellar/libyaml/0.1.7 (9 files, 299.8KB) *
  Poured from bottle on 2017-12-18 at 15:54:00
/usr/local/Cellar/libyaml/0.2.1 (9 files, 298.9KB)
  Poured from bottle on 2018-10-26 at 12:32:46
From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/libyaml.rb
==> Dependencies
Build: autoconf ✔, automake ✘, libtool ✔
==> Analytics
install: 80,195 (30 days), 252,949 (90 days), 881,478 (365 days)
install_on_request: 24,942 (30 days), 80,537 (90 days), 273,017 (365 days)
build_error: 0 (30 days) # ここのエラーは出ていても動作には大きな影響がない
```

↑↑↑
バージョンが0.2.1であることがわかったが、ローカル開発環境では、0.1.7を使いたい!
そんな時に`brew switch`:thumbsup:

```ruby
brew switch libyml 0.1.7 # これで0.1.7が有効になる
```

## brewでインストール出来る一覧を知りたい場合

※ HOMEBREW_VERSION: 1.8.0時点のフォルダ構成で実行

`brew update`　コマンドでは、
`/usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula` ディレクトリに対して、 
Homebrewのgithubリポジトリの内容を `git pull`して`Formulae`というインストールレシピを最新にする模様 :pencil: 

<font color="Red">*※ 紛らわしいけど、Formulae(インストールレシピ)の入ってるディレクトリ名はeの抜けたFormulaなので注意*</font>

```ruby
# homebrew-core/Formulaに移動（lsを叩くとbrewでインストールできるパッケージが並ぶ）
$ cd /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula
$ ls # 以下の一覧は brew　installしたいときは、末尾の.rbより前の部分を引数に指定する(brew install libyamlのような形で)
apple-gcc42.rb                       gdb.rb                               libxc.rb                             rogue.rb
appledoc.rb                          gdbm.rb                              libxdg-basedir.rb                    roll.rb
appscale-tools.rb                    gdcm.rb                              libxdiff.rb                          rolldice.rb
apr-util.rb                          gdk-pixbuf.rb                        libxkbcommon.rb                      rom-tools.rb
apr.rb                               gdl.rb                               libxlsxwriter.rb                     root.rb
apt-dater.rb                         gdm.rb                               libxmi.rb                            roswell.rb
aptly-completion.rb                  gdmap.rb                             libxml++.rb                          roundup.rb
aptly.rb                             gdnsd.rb                             libxml++3.rb                         rp.rb
aqbanking.rb                         gdrive.rb                            libxml2.rb                           rpcgen.rb
arabica.rb                           gdub.rb                              libxmlsec1.rb                        rpg.rb
arangodb.rb                          geant4.rb                            libxmp-lite.rb                       rpl.rb
aravis.rb                            gearboy.rb                           libxmp.rb                            rpm.rb
arcade-learning-environment.rb       gearman.rb                           libxo.rb                             rpm2cpio.rb
archey.rb                            gearsystem.rb                        libxslt.rb                           rrdtool.rb
archi-steam-farm.rb                  geckodriver.rb                       libxspf.rb                           rsnapshot.rb
archivemail.rb                       gecode.rb                            libyaml.rb                           rssh.rb
archivemount.rb                      gedit.rb                             libyubikey.rb                        rsstail.rb
argon2.rb                            geeqie.rb                            libzdb.rb                            rst-lint.rb
argp-standalone.rb                   gegl.rb                              libzip.rb                            rswift.rb
argtable.rb                          gem-completion.rb                    libzzip.rb                           rsync-time-backup.rb
argus-clients.rb                     genact.rb                            lifelines.rb                         rsync.rb
argus.rb                             genders.rb                           lightning.rb                         rsyslog.rb
argyll-cms.rb                        generate-json-schema.rb              lighttpd.rb                          rt-audio.rb
aria2.rb                             genext2fs.rb                         lilv.rb                              rtags.rb
ark.rb                               gengetopt.rb                         lincity-ng.rb                        rtf2latex2e.rb
arm-linux-gnueabihf-binutils.rb      genometools.rb                       link-grammar.rb                      rtmidi.rb
armadillo.rb                         genstats.rb                          linkerd.rb                           rtmpdump.rb
armor.rb                             geocode-glib.rb                      linklint.rb                          rtptools.rb
arp-scan.rb                          geogram.rb                           links.rb                             rtv.rb
arp-sk.rb                            geographiclib.rb                     liquibase.rb                         rubberband.rb
arpack.rb                            geoip.rb                             liquid-dsp.rb                        ruby-build.rb
arping.rb                            geoipupdate.rb                       liquidprompt.rb                      ruby-completion.rb
arpoison.rb                          geomview.rb                          liquigraph.rb                        ruby-install.rb
arss.rb                              geos.rb                              little-cms.rb                        ruby.rb
artifactory.rb                       geoserver.rb                         little-cms2.rb                       ruby@1.8.rb
arx-libertatis.rb                    gerbv.rb                             livestreamer.rb                      ruby@2.0.rb
arx.rb                               gerrit-tools.rb                      lldpd.rb                             ruby@2.2.rb
ascii.rb                             get-flash-videos.rb                  llnode.rb                            ruby@2.3.rb
asciidoc.rb                          get_iplayer.rb                       llvm.rb                              runcocoa.rb
asciidoctor.rb                       getdns.rb                            llvm@3.9.rb                          runit.rb
asciidoctorj.rb                      getmail.rb                           llvm@4.rb                            rush.rb
asciinema.rb                         gettext.rb                           llvm@5.rb                            rust.rb
asciiquarium.rb                      getxbook.rb                          llvm@6.rb                            rustc-completion.rb
asciitex.rb                          gexiv2.rb                            lm4tools.rb                          rustup-init.rb
asdf.rb                              gf-complete.rb                       lmdb.rb                              rxvt-unicode.rb
asio.rb                              gflags.rb                            lmod.rb                              ry.rb

<中略>

```

## brew cleanup

brew は古くなった formula を自動的に消してくれないので、使い続けるほどにインストールしたパッケージが積もってディスクを圧迫する場合があるようです。　　
そこで `brew cleanup` が大活躍です！ 
このコマンドを実行することでbrewが管理している古いバージョンを消したり、ダウンロードしたファイルのキャッシュを消したりしてくれます！
Macのお掃除によってストレージ容量が増えて超便利というわけです :relaxed:

```ruby
$ brew cleanup
Removing: /usr/local/Cellar/awscli/1.14.10... (4,612 files, 41.3MB)
Warning: Skipping fontconfig: most recent version 2.13.1 not installed
Warning: Skipping freetype: most recent version 2.9.1 not installed
Removing: /usr/local/Cellar/gdbm/1.13... (19 files, 553.9KB)
Warning: Skipping htop: most recent version 2.2.0 not installed
Removing: /Users/fuqda/Library/Logs/Homebrew/yarn... (100B)
Removing: /Users/fuqda/Library/Logs/Homebrew/fish... (64B)
Removing: /Users/fuqda/Library/Logs/Homebrew/rbenv... (64B)
<中略>
==> This operation has freed approximately 1.3GB of disk space.
```

## brew cleanupの注意点：古いformulaが削除されるとマズい場合はやらないこと！

例えば、古いバージョンと新しいバージョンのパッケージを使い分ける必要がある場合に無闇に`brew cleanup`すると、古いバージョンのformulaがないために、`brew switch`でバージョンのswitchが出来なくなるので注意が必要です:sweat: 

# 最後に
普段何気なく使っているHomebrewですが、自分自身としてブラックボックスな部分が多いツールだったので、自分なりに理解するため投稿させて頂きました。
間違いなどありましたら、ご指摘頂ければ幸いです:bow_tone1: