node2nixが謎に失敗するので直した

始めに

たけてぃが書いたnode2nixの使い方を参考に、claude-codeやccusageをnode2nixで管理するようにしていた。
理由としては、更新頻度が高かったりしていて、nixpkgsのレビューとマージのスピードに追い付かないことがままある。
個人でパッケージのバージョン管理を楽にするためnode2nixを使っている。

最近の仕事が落ち着いたこともあって、久々にflake.lockの更新をしたらなぜかnode2nixでインストールしているパッケージのビルドが失敗してしまった。
ただ、アレコレ見ていたら原因が分かったので、とりあえずメモを残しておく。

結論

この9c851d25というコミットで解決した。

方法としては、以下の通りだ。

-  nodePkgsBuilder = pkgs: pkgs.callPackages ../node2nix { inherit pkgs; };
+  nodePkgsBuilder = pkgs: pkgs.callPackages ../node2nix {
+    inherit pkgs system;
+    nodejs = pkgs.nodejs_24;
+  };

雑ではあるが、pkgs.callPackagesでnode2nixのファイルを読み込む際に、引数のAttrSetにnodejsを明示してあげれば良い。

問題解決までの流れ

エラー内容の把握

ccusage> /build/.attr-15dhb26v5nfdpwqlxzm6hnavmmp7kcjb3jivxnf2y23z897fryb3: line 4: node: command not found

まず上記のエラーが発生していて、どういう訳かnodeコマンドがビルド中に存在しないと言っている。

これまで発生していない現象のため、とりあえずビルドしている部分を追ってみた。

node-packages.nixの内容を確認

https://github.com/yasunori0418/dotfiles/blob/9c851d258101b802571fb6f1e8775fd21e5dff0f/node2nix/node-packages.nix

とりあえず怪しんだのは、buildInputsに指定しているglobalBuildInputsだ。
ファイル冒頭の引数の宣言は以下のようになっている。

  globalBuildInputs ? [ ],

これはglobalBuildInputsという引数が渡されなければ、空の配列になるという物だ。
では、このglobalBuildInputsがどのように渡されているかを確認するため、callPackagesしているdefault.nixを読んでみた。

default.nixの内容を確認

https://github.com/yasunori0418/dotfiles/blob/9c851d258101b802571fb6f1e8775fd21e5dff0f/node2nix/default.nix

ぱっと見た限りでは、globalBuildInputsは存在しない。
ただ、default.nixという関数を読む限り、8行目にnodejs_14を指定しているので、これをcallPackagesのタイミングで正しく渡して上げれば解決できそうと判断した。

その後、結論に書いたコミットで実際にnix-rebuildを実施したところ、問題なくビルドに成功した。

まとめと根本原因の解明

原因解決してから、とりあえずこの文章を書きながら、作業内容を雑に書き出してみた。

書きながら、最終的になぜ失敗するか判明した。

原因としては、nodejs_1(4|6)がnixpkgsで管理されなくなったことによる失敗であった。 対応するPRは以下の通り。

https://github.com/NixOS/nixpkgs/pull/264358

とりあえず安定版ではないnixpkgsを使用している場合、node2nixを使用するときは、nodejsの明示的な宣言が必要だ。

Licensed under CC BY-NC-SA 4.0
最終更新 2025-08-26T19:25:39
Hugo で構築されています。
テーマ StackJimmy によって設計されています。