Hash the media plane's git deps rather than cloning them per eval
allowBuiltinFetchGit fetched jolt-native's seven git dependencies with builtins.fetchGit, which runs at evaluation: every `nix run .#tui` cloned them in full, all refs, even with the built library already in a cache, and the clones are not derivations so no cache could hold them. Hashed, they are ordinary fixed-output derivations — one entry per repo, since nixpkgs keys these by commit and covers the workspace siblings. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
7095bb6 parent: 6ba34b9 modified
flake.nix +24 -1 | @@ -146,9 +146,32 @@ | ||
| 146 | 146 | version = "0.1.0"; |
| 147 | 147 | src = jolt-native; |
| 148 | 148 | |
| 149 | + # The media plane's deps are seven git repos rather than crates.io | |
| 150 | + # releases. `allowBuiltinFetchGit` would fetch them with | |
| 151 | + # builtins.fetchGit, which happens at *eval* time — so every | |
| 152 | + # evaluation clones them in full (all refs), even when the built | |
| 153 | + # library is already in a cache, and the clones themselves are not | |
| 154 | + # derivations and can never be substituted. Hashed, they are plain | |
| 155 | + # fixed-output derivations: one entry per repo (nixpkgs keys these | |
| 156 | + # by commit, so the sibling crates out of the same workspace are | |
| 157 | + # covered), substitutable, fetched once. The cost is that these | |
| 158 | + # move whenever jolt-native's Cargo.lock does. | |
| 149 | 159 | cargoLock = { |
| 150 | 160 | lockFile = "${jolt-native}/Cargo.lock"; |
| 151 | - allowBuiltinFetchGit = true; | |
| 161 | + outputHashes = { | |
| 162 | + # github.com/Frando/moq @ 53fe78d8 — moq-lite, moq-native, hang, conducer | |
| 163 | + "moq-lite-0.15.5" = "sha256-wh8telcXK4Zqaefs42n6LJitye8cc0rAmXd8RtJZJ+Q="; | |
| 164 | + # github.com/n0-computer/iroh-live @ edd9bcc5 — iroh-moq, moq-media, rusty-{capture,codecs} | |
| 165 | + "iroh-live-0.1.0" = "sha256-+bOIMXU4F/9toLZ25MFRA0Kd3Cr4iyP4icOfBkObtfU="; | |
| 166 | + # github.com/n0-computer/iroh @ 8af8370b — iroh, iroh-base, iroh-relay | |
| 167 | + "iroh-0.97.0" = "sha256-tCEzLwu+bcAiH0dMmQoKRB24N5eiNG6BNixod8Y6igo="; | |
| 168 | + # github.com/Frando/web-transport @ f7a523f1 — the four web-transport-* crates | |
| 169 | + "web-transport-proto-0.6.0" = "sha256-5WP98+nTI6FR23AM7DNf0nnsolqr7M0RHxY09NNdDzs="; | |
| 170 | + # github.com/n0-computer/noq @ ab042ea7 — noq, noq-proto, noq-udp | |
| 171 | + "noq-0.17.0" = "sha256-aur6ekfwr3PsnR8RrBKLgCvujQRi4tccyK9nJo6O+Tg="; | |
| 172 | + "iroh-gossip-0.97.0" = "sha256-DEIq1BCsCZL+1q9yiEZAXzv7wxvIXgsW044Y8uHW7PU="; | |
| 173 | + "iroh-smol-kv-0.3.1" = "sha256-oXGdnJVyQfiomzyZhj5r7ez4Uxh73imGt6V9+vHTQZQ="; | |
| 174 | + }; | |
| 152 | 175 | }; |
| 153 | 176 | |
| 154 | 177 | nativeBuildInputs = with pkgs; [ |
| @@ -146,9 +146,32 @@ | |||
| 146 | version = "0.1.0"; | 146 | version = "0.1.0"; |
| 147 | src = jolt-native; | 147 | src = jolt-native; |
| 148 | 148 | ||
| 149 | + # The media plane's deps are seven git repos rather than crates.io | ||
| 150 | + # releases. `allowBuiltinFetchGit` would fetch them with | ||
| 151 | + # builtins.fetchGit, which happens at *eval* time — so every | ||
| 152 | + # evaluation clones them in full (all refs), even when the built | ||
| 153 | + # library is already in a cache, and the clones themselves are not | ||
| 154 | + # derivations and can never be substituted. Hashed, they are plain | ||
| 155 | + # fixed-output derivations: one entry per repo (nixpkgs keys these | ||
| 156 | + # by commit, so the sibling crates out of the same workspace are | ||
| 157 | + # covered), substitutable, fetched once. The cost is that these | ||
| 158 | + # move whenever jolt-native's Cargo.lock does. | ||
| 149 | cargoLock = { | 159 | cargoLock = { |
| 150 | lockFile = "${jolt-native}/Cargo.lock"; | 160 | lockFile = "${jolt-native}/Cargo.lock"; |
| 151 | - allowBuiltinFetchGit = true; | 161 | + outputHashes = { |
| 162 | + # github.com/Frando/moq @ 53fe78d8 — moq-lite, moq-native, hang, conducer | ||
| 163 | + "moq-lite-0.15.5" = "sha256-wh8telcXK4Zqaefs42n6LJitye8cc0rAmXd8RtJZJ+Q="; | ||
| 164 | + # github.com/n0-computer/iroh-live @ edd9bcc5 — iroh-moq, moq-media, rusty-{capture,codecs} | ||
| 165 | + "iroh-live-0.1.0" = "sha256-+bOIMXU4F/9toLZ25MFRA0Kd3Cr4iyP4icOfBkObtfU="; | ||
| 166 | + # github.com/n0-computer/iroh @ 8af8370b — iroh, iroh-base, iroh-relay | ||
| 167 | + "iroh-0.97.0" = "sha256-tCEzLwu+bcAiH0dMmQoKRB24N5eiNG6BNixod8Y6igo="; | ||
| 168 | + # github.com/Frando/web-transport @ f7a523f1 — the four web-transport-* crates | ||
| 169 | + "web-transport-proto-0.6.0" = "sha256-5WP98+nTI6FR23AM7DNf0nnsolqr7M0RHxY09NNdDzs="; | ||
| 170 | + # github.com/n0-computer/noq @ ab042ea7 — noq, noq-proto, noq-udp | ||
| 171 | + "noq-0.17.0" = "sha256-aur6ekfwr3PsnR8RrBKLgCvujQRi4tccyK9nJo6O+Tg="; | ||
| 172 | + "iroh-gossip-0.97.0" = "sha256-DEIq1BCsCZL+1q9yiEZAXzv7wxvIXgsW044Y8uHW7PU="; | ||
| 173 | + "iroh-smol-kv-0.3.1" = "sha256-oXGdnJVyQfiomzyZhj5r7ez4Uxh73imGt6V9+vHTQZQ="; | ||
| 174 | + }; | ||
| 152 | }; | 175 | }; |
| 153 | 176 | ||
| 154 | nativeBuildInputs = with pkgs; [ | 177 | nativeBuildInputs = with pkgs; [ |