技術 約3分で読めます

Viteビルドで勝手に生成されるnulファイルとGitエラーの話

何が起きたか

AIに仕様を渡してコードを生成させる「仕様駆動開発」でViteプロジェクトを作っていたときのこと。WindowsでViteプロジェクトをビルドして、いざGitでプッシュしようとしたらエラー。

error: invalid path 'dist/nul'

は?ってなって確認したら、distディレクトリ内にnulというファイルが生成されていた。しかも毎回ビルドするたびに出てくる。なんだこれ。

なぜこうなるのか

これはWindowsの予約デバイス名が原因。

Windowsには昔からの互換性のために、特定の名前がデバイス名として予約されている。代表的なものはこれ:

  • NUL - null デバイス(Linuxの/dev/null相当)
  • CON - コンソール
  • PRN - プリンター
  • AUX - 補助デバイス
  • COM1COM9 - シリアルポート
  • LPT1LPT9 - パラレルポート

これらの名前は拡張子をつけてもファイルとして扱えない。nul.txtとかもダメ。大文字小文字も関係ない。

Unix系のツールやライブラリが/dev/null的な処理をしようとして、Windows上でnulというパスを生成してしまうことがある。Viteか、その依存関係のどこかでこれが起きているっぽい。

Gitはこれらの予約デバイス名を含むパスをWindows上で正しく扱えないため、プッシュ時にエラーを吐く。

対処法

根本的な解決はVite側(または依存ライブラリ側)の修正を待つしかないが、とりあえずの対処としては.gitignoreに追加する。

nul

これでGitの追跡対象から外れるので、プッシュ時のエラーは回避できる。

AI駆動開発での落とし穴

ちなみにこの問題、AIにautoモードで実行させ続けてたら全然解決しなかった。

AIは.gitignoreに追加するというシンプルな解決策を取らず、パスの変更とか文字コードの調整とか、回りくどい方法で何とかしようとしてひたすらループ。一旦止めて、人間がnulファイルを消して.gitignoreに追記したらあっさり解決した。

人間が一からコード書いてたら、こんな問題が起きてもすぐ気づくし、対処も一瞬だと思う。AIにコードを書かせる時代になっても、ソースコードを読んで状況を把握する能力はまだ捨てちゃダメだなと実感した。

まとめ

Windowsで開発してると、こういうUnix前提のツールとの相性問題にたまに遭遇する。nulが出てきたらWindowsの予約デバイス名の問題だと思い出してほしい。

ついでに言うと、日本語パスもWindowsでの開発トラブルの定番。プロジェクトのパスに日本語が含まれていると、ビルドツールやライブラリによっては謎のエラーを吐くことがある。C:\Users\田中\projects\... みたいなパスは避けて、英数字のみのパスにプロジェクトを置くのが無難。

正直、この日本語パス問題っていつか対応されるのかとずっと思ってるけど、たぶん無理だと思う。Vite単体の問題じゃなくて、依存ライブラリ(esbuild、rollupなど)のどこかでパス処理がコケてるだけだし、OSS開発者の多くはMac/Linuxで開発してるから、Windows + 日本語パスなんてテストされにくい。「英数字パスに置けば回避できる」から直す動機も弱い。

結局、半永久的に「日本語パスは避けろ」がベストプラクティスのままだと思う。Windowsユーザー名が日本語の人は C:\dev\ みたいなフォルダを作って逃げるしかない。