[Nix-dev] Fixing module arguments (PROPOSAL MAY BREAK EXISTING NIXOS CONFIGS, PLEASE READ)

Shea Levy shea at shealevy.com
Wed Feb 19 18:38:14 CET 2014


On Wed, Feb 19, 2014 at 12:30:00PM -0500, Shea Levy wrote:
> Hey Eelco,
> 
> On Wed, Feb 19, 2014 at 06:05:36PM +0100, Eelco Dolstra wrote:
> > Hi,
> > 
> > On 19/02/14 16:44, Shea Levy wrote:
> > 
> > > Hi all,
> > <snip>
> > 
> > IMHO, removing the "pkgs" argument has basically no advantages to users, and a
> > lot of disadvantages (namely, it breaks pretty much every existing module, and
> > makes modules more verbose).
> > 
> 
> IMO a cleaner interface and improved maintainablity are advantages to
> users, but I take your point.
> 
> >
> > > * The configuration must be partially evaluated with a default value for
> > >   pkgs and then *re-evaluated* with the final value for pkgs. Due to how
> > >   this partial evaluation works (only configuration.nix, its imports,
> > >   and nixpkgs.nix are included in the evaluation), no modules in
> > >   module-list.nix except nixpkgs.nix can affect pkgs.
> > 
> > So the problem is not the "pkgs" argument, it's the circular dependency in
> > defining "pkgs" because modules do things like "pkgs.lib.mkOption".  If they
> > used "config.nixpkgs.pkgs.lib.mkOption", you would have exactly the same
> > problem.  If you get rid of references to "pkgs.lib" (at least in the "critical
> > path" used to define "pkgs") then the whole problem goes away.
> > 
> > So I'm all in favor of rewriting modules that do
> > 
> >   { config, pkgs, ... }:
> > 
> >   with pkgs.lib;
> > 
> > to
> > 
> >   { config, pkgs, lib, ... }:
> > 
> >   with lib;
> > 
> 
> If you agree with requiring this change, then I get 95% of what I want.
> Great :). Could even implement part of the conservative proposal so that
> arguments can be handled modularly without changing the user interface
> at all.
> 
> >
> > > The additional practical effects this has on my implementation of
> > > modular nixops networks are:
> > > 
> > > * I need a new type "submoduleWithExtraArgs", as the submodule type
> > >   doesn't pass any extra arguments besides "name" to the submodules and
> > >   that can't work with using NixOS configurations as submodules.
> > > * I need a new type "dependentAttrsOf", where the type of the attr value
> > >   can depend on the attr name, as different machines in one network
> > >   might have different settings for nixpkgs.config and thus should be
> > >   passed different values of pkgs, but as per point 1 the arguments
> > >   passed to the submodule have to be part of the type
> > > * I have to duplicate NixOS's two-phase eval for *each* machine in the
> > >   network
> > 
> > I don't really see why you need any of these things.  For instance, the
> > implementation of NixOS containers supports having NixOS sub-configurations just
> > fine without them.
> > 
> 
> I'd argue that the NixOS container support implements a version of these
> types (though not the double-import duplication), but without the type
> checking. The 'config' submodule argument has no type but really it's
> meant to be a submodule, and instead of letting the submodule merge
> function evaluate the list of values you pass them off to
> eval-config.nix. That's replicating nearly all the work the submodule
> type does, and if I were to do something similar for all of the current
> resource types (which after all take a "resources" and "uuid" argument)
> I'd need to replicate *all* of the work as I don't have an
> eval-config.nix to fall back on for e.g. s3Buckets.
>

Although taking a second look at it, while I do still think I need
submoduleWithExtraArgs I won't need dependentAttrsOf if I do something
similar to how that option is a submodule, one of whose options is
another submodule.

> 
> >
> > -- 
> > Eelco Dolstra | LogicBlox, Inc. | http://nixos.org/~eelco/
> > _______________________________________________
> > nix-dev mailing list
> > nix-dev at lists.science.uu.nl
> > http://lists.science.uu.nl/mailman/listinfo/nix-dev
> _______________________________________________
> nix-dev mailing list
> nix-dev at lists.science.uu.nl
> http://lists.science.uu.nl/mailman/listinfo/nix-dev


More information about the nix-dev mailing list