From 2e689d58cbbe6b7047bb132dc79097016e606dd0 Mon Sep 17 00:00:00 2001 From: Robert Hensing Date: Tue, 7 Feb 2023 20:51:17 +0100 Subject: [PATCH] lib/modules: Improve error when a configuration is imported This is appears to be a fairly common mistake for beginners who want to build larger things from the system configurations, such as NixOps networks, etc. Further explanation seems appropriate. --- lib/modules.nix | 1 + lib/tests/modules.sh | 1 + lib/tests/modules/import-configuration.nix | 12 ++++++++++++ 3 files changed, 14 insertions(+) create mode 100644 lib/tests/modules/import-configuration.nix diff --git a/lib/modules.nix b/lib/modules.nix index 8233b4b9e84e..3bcd8d280b74 100644 --- a/lib/modules.nix +++ b/lib/modules.nix @@ -347,6 +347,7 @@ let }; result = withWarnings { + _type = "configuration"; options = checked options; config = checked (removeAttrs config [ "_module" ]); _module = checked (config._module); diff --git a/lib/tests/modules.sh b/lib/tests/modules.sh index 4da0cb38f685..d12e503c4b1d 100755 --- a/lib/tests/modules.sh +++ b/lib/tests/modules.sh @@ -368,6 +368,7 @@ checkConfigError 'The module foo.nix#darwinModules.default was imported into nix # _type check checkConfigError 'Could not load a value as a module, because it is of type "flake", in file .*/module-imports-_type-check.nix' config.ok.config ./module-imports-_type-check.nix checkConfigOutput '^true$' "$@" config.enable ./declare-enable.nix ./define-enable-with-top-level-mkIf.nix +checkConfigError 'Could not load a value as a module, because it is of type "configuration", in file .*/import-configuration.nix' config ./import-configuration.nix # doRename works when `warnings` does not exist. checkConfigOutput '^1234$' config.c.d.e ./doRename-basic.nix diff --git a/lib/tests/modules/import-configuration.nix b/lib/tests/modules/import-configuration.nix new file mode 100644 index 000000000000..a2a32bbee4ca --- /dev/null +++ b/lib/tests/modules/import-configuration.nix @@ -0,0 +1,12 @@ +{ lib, ... }: +let + myconf = lib.evalModules { modules = [ { } ]; }; +in +{ + imports = [ + # We can't do this. A configuration is not equal to its set of a modules. + # Equating those would lead to a mess, as specialArgs, anonymous modules + # that can't be deduplicated, and possibly more come into play. + myconf + ]; +}