(no title)
bergkvist | 2 years ago
Building third party flakes takes forever since every flake uses its own version of nixpkgs. If you don't pin your third party flake urls they might also change under your nose as you run the same command again a day later.
Flakes are coupled to git. You need to remember to stage changes whenever you do Ctrl+S in your editor before rebuilding. I've wasted more time than I'd like to admit wondering why what I'm building doesn't include my latest change.
Flakes copy the entire directory into the nix store. This is terrible for mono-repos - and especially if it contains any large files. There is an issue about making the copying of the entire directory into /nix/store lazy - though this doesn't really address the problem. It just treats some common symptoms.
This kind of copying would likely be a lot more acceptable if it was specified explicitly in flake.nix, rather than implicitly. Then you could also use your own filters for ignoring files, rather than relying on the coupling to git and its staging area.
pxc|2 years ago
You're probably already aware, but for the benefit of newcomers in this thread, here's a link to the massive PR trying to work out more efficient copying of local flakes to the Nix store:
https://github.com/NixOS/nix/pull/6530
A few dedicated folks are working really hard to break that thing down and test it and get it merged. I can hardly wait!
predictabl3|2 years ago
This is decidely not quite true. You must have the file visible to Git. Flakes still just uses the files, as long as they're tracked by git. As long as you have no new files that aren't in the index, staging unstaged changes will not change eval.
That said, yes, when you add a new file to a flakes repo, you start to develop a habit of always adding it to the stage/index for eval.
but you should ONLY ever see this as a very very obvious "file not found", it is not a subtle problem as this post implies.
colordrops|2 years ago
_hl_|2 years ago
The “official” (as in, community consensus) solution seems to be to bring your own nixpkgs, and manually override the nixpkgs of every dependency (and their transitive dendencies) and verify your build still works. Which just doesn’t seem right to me.
Flakes are great for building an ecosystem of composable, reproducable software. The more they succeed at that, the bigger the problem becomes. Surely it’s not too late to figure out a principled solution before stabilizing flakes?
kaba0|2 years ago
That way you get the benefit of a minimal-sized system with no size overhead for the most part, yet out-of-tree git repos get reproducible at any commit, and it is even easier than adding a new repo to apt, etc.
With content-addressable hashing, the problem may largely solve itself, reusing unchanged dependencies between older flakes.
packetlost|2 years ago
The way I would do it with nix is: because everything gets hashed, just check that the built output with a new nix-pkg version matches the hash with the old version and fail out/fetch the older version as a second step. The rest is just finding ways to cache that build fail information so that you can share the result across users transparently.
lillecarl|2 years ago
Works well for me. Though when doing configuration changes I usually pass --no-substitutes (or smth) to not query all my subs for derivations that'll never be in a remote cache.
viraptor|2 years ago
That's not quite right. It may use a predefined version of nixpkgs and there may be a reason the version is hardcoded to something. But if that's not what you want, you can use something like `nix run ... --override-input nixpkgs nixpkgs` and it will run with your current system nixpkgs version instead.
pmarreck|2 years ago
There's an upside to this: I've been in situations where I've lost the definition of a previous configuration because I didn't check the state of it at that point into source control. By "forcing" the user (me) to at least add the current state to source control (if not commit it), it makes it more likely for me to have the configuration/definition for the state saved at the same time as the state itself.
pxc|2 years ago
jchw|2 years ago
Given that the Git thing is meant to stop you from shooting yourself in the foot, I think maybe it's time to conclude it wasn't really that great of an idea. However, I still see why it works that way.
rrix2|2 years ago
tikhonj|2 years ago
rq1|2 years ago
ParetoOptimal|2 years ago
You only need to `git add` the file once.
You do not need to stage every change after that before flakes can "see" the change.
bergkvist|2 years ago
yencabulator|2 years ago
jacoblambda|2 years ago
Could you not just do a sparse checkout for monorepos?
https://github.com/NixOS/nixpkgs/pull/135881
bergkvist|2 years ago
Let's say I'm working on a huge monorepo locally, with GBs of code and data in it, most of which I want to ignore in my nix build. Let's say the files I actually care about are also not in a single subfolder. Then I can't just move the flake.nix to that subfolder either.
yencabulator|2 years ago
That's what flake.lock is for, it remembers the versions picked. No need to put versions in the flake urls just for that.
lemper|2 years ago
then what's the point of using nix and flakes if flakes destroy the very point of nix, reproducibility?