brewでインストールしたyarnのバージョンを変更する

brewでインストールしているyarn（他のパッケージでも手順は基本的に同じです）のバージョンが新しすぎたため、古バージョンに戻す方法で詰まってしまった。この手の手順はすでにいくらでもあると思ったのだけれど、そもそも説明がまちがっていたり、homebrew/versionsがdeprecatedされる前の手順であったので新しく書いた。

## 前提
- ローカルのMac環境において
- `yarn 1.13.0` をインストール済みだけど
- `yarn 1.12.3` に変更したい

## やること

### 0. はじめに

前提：npmでyarnをインストールしている場合はアンインストールする。という手順が散見されるが、これは適当ではない。公式のドキュメントによると以下のように書かれているが、これはDebian、UbuntuおよびCentOSのような一般的なLinuxのディストリビューションでのお話。

> 注意: npm から Yarn をインストールすることは一般的にはお勧めしません。 Node ベースのパッケージマネージャで Yarn をインストールする場合は、パッケージは署名されておらず、整合性のチェックはベーシックな SHA1 ハッシュのみで行われており、システム全体にまたがるアプリケーションをインストールする場合にはセキュリティリスクとなります。

出典：https://yarnpkg.com/ja/docs/install#alternatives-stable

### 1. どこのyarnが呼ばれているか確認する

自分の環境ではanyenvを使っているのでこちらは問題なさそう。

```
$ which yarn
/Users/himatani/.anyenv/envs/ndenv/shims/yarn
```

### 2. brewのバージョンを確認する

`which {package}` コマンドによって意図してない結果が返ってきた場合は、そもそもyarnをインストール済みであることを確認する。インストールしていなければ `brew install yarn` で入れる（最新のバージョンでインストールされる）。

```
$ brew list yarn
yarn
```

自分の環境では最新（2019/02/18 現在）の `1.13.0` が入っていた。ちなみに、 `brew list --versions` コマンドでパッケージ名を指定すると、インストール済みのすべてのバージョンが確認できる。

```
$ yarn -v
1.13.0

$ brew list --versions yarn
yarn 1.13.0
```

### 3. 旧バージョンが提供されていないか探す

Homebrewの公式から古いバージョンが提供されていないか探すために、以前であれば以下のようにして検索できたがすでにdeprecatedとなってしまっている。（2019/02/18 現在）

```
$ brew tap homebrew/versions
$ brew search versions/yarn
```

### 4. 旧バージョンのFormulaファイルを探す

仕方がないので、Homebrewの全コミットから自分が欲しいバージョンを探していく。まずは、Homebrewのリポジトリがあるディレクトリまで移動する。

```
$ cd /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula
```

`git log {package}.rb` などでgitのログを絞ってコメントを頼りに、欲しいバージョンのコミットを見つける。

```
$ git log yarn.rb
```

古いバージョンのFormulaファイルからインストールするために、コミットのハッシュ値を抜き出す。ちなみに `yarn 1.12.3` のコミットのハッシュ値は `66645f26c48fb949dfc8784dfc1b4c7ea3ead1b1` であった。

### 5. 旧バージョンのFormulaファイルでインストールする

こちらのコマンド `brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/{hash}/Formula/{package}.rb` でコミットのハッシュ値とパッケージ名を指定してbrew installできる。先ほどの手順で見つけたコミットのハッシュ値を入れてインストールする。

（ちなみに、ここで該当のコミットのハッシュ値でcheckoutして、`brew install {package}`　で旧バージョンのFormulaファイルからインストールするやり方もある。ただ自分は、インストール後にHEADに戻すのを忘れるのもあれなので、以下の手順の方が安全にインストールすればいいと思っている。）

```
$ brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/66645f26c48fb949dfc8784dfc1b4c7ea3ead1b1/Formula/yarn.rb
```

すでに最新のバージョンでインストールされているよ、と言われた場合は `brew unlink {package}` でunlinkしてあげる。

> Error: yarn 1.13.0 is already installed
> To install 1.12.3, first run `brew unlink yarn`

無事にインストールできた :beer: 

```
$ brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/66645f26c48fb949dfc8784dfc1b4c7ea3ead1b1/Formula/yarn.rb

######################################################################## 100.0%
Warning: yarn 1.13.0 is available and more recent than version 1.12.3.
==> Downloading https://yarnpkg.com/downloads/1.12.3/yarn-v1.12.3.tar.gz
==> Downloading from https://github-production-release-asset-2e65be.s3.amazonaws.com/49970642/a4875000-e25c-11e8-88b4-45d26e231bb1?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F
######################################################################## 100.0%
🍺  /usr/local/Cellar/yarn/1.12.3: 14 files, 4.7MB, built in 11 seconds
Removing: /usr/local/Cellar/yarn/1.6.0_1... (14 files, 4.1MB)
Removing: /Users/himatani/Library/Caches/Homebrew/yarn--1.12.3.tar.gz... (1.1MB)
```

インストールできると自動でインストールしたバージョンでlinkしてくれる。

```
$ yarn -v
1.12.3
```

以前のバージョンもきちんと残っている。

```
$ brew list --versions yarn
yarn 1.13.0 1.12.3
```

ちなみに、`brew switch {package} {version}` で使用するバージョンの切り替えができる。

```
$ brew switch yarn 1.13.0
```

めでたしめでたし。