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

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

$ 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

めでたしめでたし。