yarn turboをバージョンアップしたら、.envを読み込まなくなったから。。。

こんにちは、フリーランスエンジニアの太田雅昭です。

yarn turbo

turboはyarnでモノレポ環境を構築する時に役立ちます。具体的には、ルートディレクトリでturboを実行すれば、それに属するパッケージの複数のコマンドを実行できます。そのためバックエンドやフロントエンド、ライブラリなどを全て一度にビルドや実行できたりします。

turbo

Turborepo is a high-performance build system for JavaScript and TypeScript codebases.

バージョンアップしたら.envを読めなくなった

面倒くさがりですので、.envはルートに置いて、全てのパッケージからそれを読み込む構造にしていました。本番環境はCloud Runですので、環境変数はWeb UIでポチポチと入力するスタイルです。そのため、それで特に問題もないです。

turbo@1.11.2の時には、以下のようにしていました。

export $(cat .env | xargs)
turbo run dev

無理矢理な方法なのか実行するたびにワーニングは出ていましたが、動くには動いていました。ターミナルで環境変数を展開して、コマンドを実行すると言った形ですね。

ところがturbo@2.0.1にした途端、動かなくなりました。とにかく以下のようにしてエラーを解消していきました。

  • turbo.jsonの何かのキーをtasksに変更した
  • パッケージ内のそれぞれのyarn.lockファイルを消して、それぞれのディレクトリでyarn installした。yarn.lockはそこでは生成されなかったがおそらくルートでまとめられている

上記のようにしてエラーを解消していったのですが、最後に残ったのが環境変数問題です。

どうやら新しいバージョンでは、turbo run前にターミナルで展開した環境変数が無視されるようです。packageそれぞれで環境変数を読み込むロジックをつけないといけないようでした。

そこで、以下のようにしました。

package.jsonの中身

{
  "scripts":[
    "dev": "dotenv -e ../../.env -- next dev -p 3001",
  ]
}

これは、next実行前にdotenvで環境変数を読み込んでいます。turbo実行前に読み込んだ環境変数は無視されますが、packageそれぞれで読み込んだ環境変数は正常に使用することができます。

これで、turbo問題が解決しました。なお公式の説明では、.envファイルが更新された時にハッシュ値を更新するために、turbo.jsonに.envの場所を書くように勧められています。今回のことに関係あるのかないのかは定かではありませんが、備忘録として残させていただきます。

余談

なか卯の親子丼が生命線です。最近は鶏の照り焼き丼が美味しいので、マヨネーズをつけるかどうか、あるいは親子丼か、いつも迷っています。