The article “1000 instances of nixpkgs” suggests the following to avoid multiple independent instantiations of nixpkgs:
Instead of instantiating a new nixpkgs, access
nixpkgs.legacyPackages.${system}and then make sure that all dependencies use the same instance of nixpkgs.{ inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; inputs.other-dep.url = "github:other/dep"; # Use the same version of nixpkgs as us inputs.other-dep.inputs.nixpkgs.follows = "nixpkgs"; outputs = { self, nixpkgs, other-dep }@inputs: { packages = nixpkgs.lib.genAttrs [ "x86_64-linux" ] (system: let p = { nixpkgs = inputs.nixpkgs.legacyPackages.${system}; # other-dep would also access `inputs.nixpkgs.legacyPackages.${system}` # thus only using a single instance of it. other-dep = inputs.other-dep.packages.${system}; }; in # your code here accessing `p.nixpkgs` and `p.other-dep` ); }; }That way, there will only be a single instance of nixpkgs being evaluated, and consumers of your project can again follow the same practice.
In this approach, is one effectively overriding the “nixpkgs” input of the “other-dep” flake, as well as ignoring entries to that input in that flake’s “flake.lock” file?