VercelにYarn v2とプライベートレジストリのパッケージを使ったプロジェクトをデプロイする
npmのプライベートレジストリのパッケージを使っているプロジェクトでYarnをv2にアップグレードしたところ、Vercelにデプロイするのに問題が発生しました。
その問題の背景と解決策を簡単に紹介します。
背景
最近、自分が開発しているKakeruというアプリにYarn v2を導入しました。
実は、以前にも一度v2の導入を試みたことがあったのですが、PnP周りが面倒くさくて戻してしまいました。
ところが最近、こちらの記事で、PnPはオプショナルな機能であることを知りました。
また、v1もv2もグローバルにインストールする実行ファイルは同じで、プロジェクトの設定に応じて違うバージョンが実行されることも初めて知りました。
その辺を理解したことで、これならv2導入するのもありだなと思い、再度やってみることにしました。
yarn v2にまつわる誤解 | Wantedly Engineer Blog
というわけでYarnのバージョンをアップグレードしたのですが、PnPを無効にするなら、.yarn.lock
のフォーマットが変わるくらいしか変化がありません。
ところが、Vercelにデプロイするときに問題が起きました。
このアプリではFontawesome Proを使っており、プライベートnpmレジストリのパッケージを利用しています。
ローカルでは、グローバルな.npmrc
にトークンとレジストリのURLを書いていました。(v2からは、.yarnrc.yml
です。)
Vercelにデプロイするにあたっては、NPM_RC
という環境変数を設定していました。(詳細はこちら)
しかし、Yarn v2でこの環境変数が認識されなくなったようなのです。
以前は使えていた.npmrc
も使えなくなったので、v2ではnpmとの互換性を積極的に捨てに行っている気がします。
ちなみに、この問題を報告するイシューなどは見つけられていないです。
というわけで、この問題への解決策を軽く書き残しておこうと思います。
解決方法
1. 設定を書き込むシェルスクリプトを追加する
名前はoverwrite-yarn-config.sh
とでもしておきましょう。(あと、実行権限もつけておきます。)
スクリプト中の、fortawesome
の部分がパッケージのスコープ名です。
#!/bin/bash
yarn config set npmScopes.fortawesome.npmRegistryServer 'https://npm.fontawesome.example.com'
yarn config set npmScopes.fortawesome.npmAuthToken "$FONTAWESOME_NPM_AUTH_TOKEN"
2. Vercelの環境変数を設定する
ここでは、FONTAWESOME_NPM_AUTH_TOKEN
という名前にしています。
そこにトークンの文字列を設定します。
3. Vercelのデプロイ設定を変更する
"install command"の項目を./overwrite-yarn-config.sh && yarn install
に設定します。
後はデプロイするだけです。
(分かりやすさのためにこのような手順にしましたが、実際は1.を最後にやっても良いと思います。)
v1の時よりも少し複雑になってしまいましたが、このようにして無事にデプロイすることができました。
どなたかの参考になれば嬉しいです。
Discussion