2025/10/31 14:28 Nix Derivation Madness

ロボ子、大変なのじゃ! Nixパッケージシステムで奇妙な問題が発生しているみたいだぞ。

博士、一体何が起こっているんですか?

Rubyインタープリターのビルドで問題が起きてるみたいでな。`nix-shell ruby`ではRubyが使えるのに、対応するderivationファイルが見つからないんだぞ!

それは奇妙ですね。NixOSキャッシュにもderivationファイルがないとは…。

そうなんじゃ。通常、derivationを評価して出力パスを決めるはずなのに、NixOSキャッシュに存在しない理由が不明らしい。

データベースを確認したところ、問題のRubyバイナリを生成したderivationは`/nix/store/24v9wpp393ib1gllip7ic13aycbi704g-ruby-3.3.9.drv`とのことです。

ふむ、バイナリキャッシュも同じderivationを示しているのか。しかし、`nix derivation show which ruby`コマンドでは別のderivation `/nix/store/kmx8kkggm5i2r17s6l67v022jz9gc4c5-ruby-3.3.9.drv` が同じ出力になっているとは…。

これはfixed-output derivations(FOD)に関連する問題のようですね。

そう! FODでは、derivationの内容以外の変更が出力パスに影響しないのじゃ。つまり、FODを使用するderivationでは、FODのderivationパスが変わると、出力の`/nix/store`パスも変わる。

FODにgarbage属性を追加してderivationパスを変更しても、出力パスは変わらないというのは、どういうことでしょうか?

そこがミソなのじゃ! fixed-output derivationsの変更により、新しいderivationストアパスが生じる可能性があるが、依存するderivationの出力パスは同じになる場合がある。Nixpkgsでは、fixed-output derivationsの変更が新しい.drvファイルを作成するが、出力パスがNixOSキャッシュに保存されている場合、新しい.drvと出力パスのリンクが失われるのじゃ。

なるほど。複数のfixed-output derivationsを入力として持つderivationでは、同じ出力を生成する場合、入力を削除しても同じ出力が得られる場合がある、と。

その通り! まさにパラドックスじゃな。まるで、魔法みたいだぞ!

しかし、これはNixのキャッシュシステムに深刻な問題を引き起こす可能性がありますね。

そうじゃな。この問題を解決するには、fixed-output derivationsの扱いを根本的に見直す必要がありそうじゃ。

博士、何か良い解決策はありますか?

うむ、例えば、derivationのハッシュ値を計算する際に、入力だけでなく、derivationパスも考慮に入れるようにするとか…色々考えられるのじゃ。でも、それはまた別の機会に話すとするかの。

承知いたしました。勉強になります。

しかし、ロボ子よ。この問題、まるでシュレーディンガーの猫みたいじゃな。derivationが存在するのか、存在しないのか、実際に試してみるまで分からない…ってか?

博士、それは少し違うと思います…。
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。