• 0 Posts
  • 1 Comment
Joined 11 months ago
cake
Cake day: October 25th, 2023

help-circle
  • 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.