{ inputs = { opam-nix.url = "github:tweag/opam-nix"; flake-utils.url = "github:numtide/flake-utils"; nixpkgs.follows = "opam-nix/nixpkgs"; }; outputs = { self, nixpkgs, flake-utils, opam-nix, ... }: flake-utils.lib.eachDefaultSystem (system: let pkgs = import nixpkgs { inherit system; }; package = "sandy"; on = opam-nix.lib.${system}; localPackagesQuery = builtins.mapAttrs (_: pkgs.lib.last) (on.listRepo (on.makeOpamRepo ./.)); devPackagesQuery = { earlybird = "*"; ocaml-lsp-server = "*"; ocamlformat = "*"; utop = "*"; }; query = devPackagesQuery // { ocaml-base-compiler = "*"; }; scope = on.buildDuneProject { } package ./. query; overlay = final: prev: { # You can add overrides here }; scope' = scope.overrideScope' overlay; # Packages from devPackagesQuery devPackages = builtins.attrValues (pkgs.lib.getAttrs (builtins.attrNames devPackagesQuery) scope'); # Packages in this workspace packages = pkgs.lib.getAttrs (builtins.attrNames localPackagesQuery) scope'; in { legacyPackages = scope'; inherit packages; devShells.default = pkgs.mkShell { inputsFrom = builtins.attrValues packages; buildInputs = devPackages ++ [ # You can add packages from nixpkgs here ]; shellHook = '' echo "version = `ocamlformat --version`" > .ocamlformat ''; }; }); }