Not a solution, but they're working on not requiring flakes to copy the whole source directory to the store.
Have you added your flake.nix to your repo? When its not in the repo it does seem to do some copying, whereas if its checked in its pretty fast.
I believe it's due to the whole folder being copied to the
store.
Yep. There's work ongoing to alleviate this but for now it's a fundamental problem with flakes.
but I need flakes specifically because they allow to have runtime libraries, which shell doesn't seem to support. (Translating flake.nix to a shell.nix exactly has different execution results.)
I don't understand. There's nothing you can do with nix develop that you can't do with nix-shell. What do you mean "allow to have runtime libraries"? That's just buildInputs, which is the same regardless of flakes.
One can have a shell.nix that uses the flake.nix in a subdir. Here's how one can do this:
in shell.nix:
let
lock = builtins.fromJSON (builtins.readFile ./nix/flake.lock);
flake-compat = fetchTarball {
url = "https://github.com/edolstra/flake-compat/archive/${lock.nodes.flake-compat.locked.rev}.tar.gz";
sha256 = lock.nodes.flake-compat.locked.narHash;
};
src = builtins.path {
path = ./nix;
name = "source";
};
in
(import flake-compat { inherit src; }).shellNix
in ./nix/flake.nix:
{
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
flake-utils.url = "github:numtide/flake-utils";
flake-compat = {
url = "github:edolstra/flake-compat";
flake = false;
};
};
outputs = { self, nixpkgs, flake-utils, flake-compat }:
flake-utils.lib.eachDefaultSystem (system:
let
pkgs = ((import nixpkgs) {
inherit system;
}).pkgs;
in
devShell = pkgs.mkShell {
nativeBuildInputs = [ pkgs.hello ];
};
)
}
Or whatever your flake is. Mostly important that we have flake-compat.
Then do a nix flake update and ensure the nix/flake.lock file exists. At that point nix-shell (in the repo root) will start working but will use the nix/flake.nix content, and only copy files in nix/ into the store. This does limit to some extent what the flake can do, but for many devShell uses it's sufficient.
Nix