ViteRuby 3.7.0は起動方法のデフォルトがnpx経由になった
何が起きるのか
場合によっては以下のようなメッセージを目にして Vite が動かない。
Building with Vite ⚡️
rake aborted!
ViteRuby::MissingExecutableError: ❌ The vite binary is not available. Have you installed the npm packages?
悲しい。
assets:precompile
から ViteRuby が呼ばれる- ViteRuby は「はいはい♪」と起動するフリをする
- 「Viteが見つからないよぉ、ちゃんとインストールしたの?」とキレられる
いやいや、この間まで動いてた環境のままやぞ?という話。
何が変わったのか
Vite 3.7.0 以降、
- npm bin が消えます(npm v9 で消えました)
- npx を代わりに使います
という話で、これだけなら
シンプルに Ruby と Vite を組み合わせただけの環境なら問題なく動作する。
別に追加の設定は必要ない。
運悪く同じ現象に遭遇したら
今回自分がハマったのは
- monorepo 風に一つのリポジトリ内にいくつかの役割が混ざっている
- そのために npm は yarn v1 workspace を利用して容量削減してた1
- rubygems 側には workspace なんてないので上の階層にも下の階層にも ViteRuby を依存で追加
- おまけに docker run で compile していた
以上が揃っていたからで、yarn 経由でインストールした vite を、npx 経由では見つけることができずに起動に失敗するという現象だった。2
回避方法は
Configuring Vite Ruby | Vite Ruby
にあるように vite のパスを上書きしてあげる方法で、今回は
環境変数 VITE_RUBY_VITE_BIN_PATH
に ./node_modules/.bin/vite
を追加
して解決した。