2017/01/16 (月) 追記:
CircleCI の公式ドキュメントに yarn の導入方法が明記されています。今後はそちらに合わせるのがベターです。
これまで行っていた設定だと、yarn
のパッケージインストールのタイミングで「すでに yarn がインストール済み」とエラーが発生するようになってしまいました。よって以下は古い記事なので、読み飛ばしてください。
要約すると
- yarn 0.17.x から、キャッシュ保存先が OS によって変わる ようになった!
- CI で
~/.yarn-cache/
をキャッシュする設定を入れている場合、正しいパスに変える必要がある-
~/.cache/yarn/
(Linux の場合)
-
事の流れ
先週あたりから、npm に代わって yarn を使い始めました。
実際にビルドやデプロイが早くなったり、CI が早くなったりと、いろんな好影響があって yarn バンザイな感じです。
CircleCI の設定
ちょうど CircleCI を使用していたので、先人の知恵をありがたくお借りして実装を進めました。
yarn 0.16.x までの設定
machine: node: version: 4.6.0 post: - curl -o- -L https://yarnpkg.com/install.sh | bash dependencies: cache_directories: - "~/.yarn-cache" pre: - yarn --version override: - yarn install test: override: - echo test
キャッシュディレクトリとして
~/.yarn-cache
を指定しておくのがミソ。
CircleCI 上で確認
ディレクトリのキャッシュ設定が上手くできていない場合は yarn install
で [2/4] Fetching packages...
が走ってしまいますが、キャッシュできている場合はその前で止まります。
キャッシュできてる | キャッシュできてない |
---|---|
※ yarn.lock
に変更が無いことが前提です。
yarn 0.17.x におけるキャッシュフォルダの変更
この設定で、先日まで上手く動いていたのですが、今日 CI を確認したところ、CI のキャッシュが効いてない(右図の)状態になっていました。
調べたところ、先日 stable になったバージョン (0.17.6
) で、macOS / Linux の yarn キャッシュフォルダが変更になった ようです。
- Use ~/Library/Caches as default cache location on OSX by kittens · Pull Request #1638 · yarnpkg/yarn
- Use ~/.config/yarn and ~/.cache/yarn on Unix systems - fixes #1672 by kittens · Pull Request #1679 · yarnpkg/yarn
OS | 新しいキャッシュ先 |
---|---|
macOS | ~/Library/Caches/Yarn/ |
Linux | ~/.cache/yarn/ |
ちなみに、フォルダの変更自体は 0.17.0
の時点ですでに適用されていたみたいです。
~/.yarn-cache/
の設定を見直そう
ということで、~/.yarn-cache/
を CI でキャッシュする設定を書いている場合は、CI のコンテナ OS に合わせてパスを見直す 必要があります。
dependencies:
cache_directories:
- - "~/.yarn-cache"
+ - "~/.cache/yarn"
キャッシュフォルダの場所を調べる
以下のコマンドで、現在の環境のキャッシュフォルダの場所がわかります。
$ yarn cache dir
出力はこんな感じ。
yarn cache v0.17.6
/Users/yhatt/Library/Caches/Yarn
✨ Done in 0.05s.
cd $(yarn cache dir --silent)
みたいに動的に使う事もできるかな?と思ったんですが、残念ながら --silent
オプション未対応。
無理やり yarn cache dir | sed -n 2p
とする事もできますが、出力フォーマットが変わったりすると対応できなくなる可能性があるのでオススメしません。