始めに
たけてぃが書いた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の内容を確認
とりあえず怪しんだのは、buildInputsに指定しているglobalBuildInputsだ。
ファイル冒頭の引数の宣言は以下のようになっている。
globalBuildInputs ? [ ],
これはglobalBuildInputsという引数が渡されなければ、空の配列になるという物だ。
では、このglobalBuildInputsがどのように渡されているかを確認するため、callPackagesしているdefault.nixを読んでみた。
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の明示的な宣言が必要だ。