2025/05/25 10:14 Changelog: Lazy trees (faster Nix builds)

やっほー、ロボ子!今日はNixのLazy Treesについて話すのじゃ。

博士、こんにちは。Lazy Treesですか?初めて聞きました。

Lazy Treesは、Nixのバージョン3.5.2で導入された新しい機能で、大規模なmonorepoでのNixの効率を向上させるものなのじゃ!

monorepoの効率向上ですか。具体的にはどういうことでしょう?

例えば、Nixpkgsリポジトリ内での評価では、wall timeが3倍以上、ディスク使用量が20倍以上も削減される事例があるのじゃ!

それはすごいですね!どうやって有効にするんですか?

Determinate Nixをインストールまたはアップグレード後、`/etc/nix/nix.custom.conf`に`experimental-features = nix-command flakes lazy-trees`を追記するだけなのじゃ。

なるほど、簡単ですね。でも、なぜそんなに効率が上がるんですか?

Lazy Treesを有効にすると、必要なソースのみがコピーされるからなのじゃ。無効にしていると、`flake.nix`への変更でソースツリー全体がNix storeにコピーされてしまうのじゃ。

つまり、必要な部分だけをコピーするから、評価が速くなってディスク使用量も減るんですね。

その通り!例えば、Lazy Treesを無効にした場合、Nixpkgsで評価すると304MBのディスクスペースを使用するけど、有効にすると13MBで済むのじゃ。

それは大きな違いですね。CI環境ではどうですか?

GitHub ActionsでのCI実行において、Lazy Treesを使用しない場合、wall timeが約11秒、ディスク使用量が433MBなのじゃ。でも、Lazy Treesを使用すると、wall timeが3.5秒、ディスク使用量が11MBになるのじゃ!

CIの時間が大幅に短縮されますね!

ただし、注意点もあるのじゃ。リポジトリのルートを derivation のソースとして指定すると、非効率なコピーが発生する可能性があるのじゃ。

`./.`をソースとして使用する代わりに、`name = "something"; src = ./.;`を使用すると良いんですね。

そうそう!Determinate Nix Actionを使用し、設定で`lazy-trees = true`を指定することで、GitHub ActionsでLazy Treesを試すことができるのじゃ。

試してみる価値ありそうですね。Determinate Nixのアップグレードはどうすれば良いですか?

既存のDeterminate Nixユーザーは、コマンド`determinate update`でバージョン3.5.2にアップグレードできるのじゃ。新規ユーザーは、macOS用のグラフィカルインストーラーまたはLinux用のインストールスクリプトを使うのじゃ。

Lazy Treesの導入で、Nixの効率が大幅に向上することがよくわかりました。ありがとうございます、博士!

どういたしまして!ちなみに、Lazy Treesを有効にすると、私の部屋の掃除もLazyになってしまうかもしれないのじゃ…!

それは困ります!博士の部屋の掃除は私が担当ですから、Lazyにはさせませんよ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
