NixOS Module System | 150 Members | |
| 28 Servers |
| Sender | Message | Time |
|---|---|---|
| 14 Jan 2026 | ||
| I'd need to spend some time on the implementation of the modules system to be of some help. I don't want to derail the discussion, but I'll just leave here my complaint that nix is lacking a type system and it's being reimplemented at run-time.
Which is a bit absurd. It seems to me that the general feeling in the community is that nix won't get a type system any time soon. Maybe we need something like | 09:17:51 | |
| * I'd need to spend some time on the implementation of the modules system to be of some help. I don't want to derail the discussion, but I'll just leave here my complaint that nix is lacking a type system and it's being reimplemented at run-time.
Which is a bit absurd. It seems to me that the general feeling in the community is that nix won't get a type system any time soon. Maybe we need something like | 09:18:11 | |
| * I'd need to spend some time on the implementation of the modules system to be of some help. I don't want to derail the discussion, but I'll just leave here my complaint that nix is lacking a type system and it's being reimplemented at run-time.
Which is a bit absurd. It seems to me that the general feeling in the community is that nix won't get a type system any time soon. Maybe we need something like | 09:18:42 | |
Honestly, you'll get much more out of experiments with things like
The check function is what the module system uses to check "does this definition match this type". Every type has a
If you're curious about impl, you can use the repl to find where something is defined too:
I.e., "union" types (like In this way, it'd be useless to declare an As I said before, you can work around this using
This is a proposal for how union types can be smarter, by taking advantage of v2 check&merge. Essentially, the v2 system was recently added to Nixpkgs and combines the checking and merging responsibility into a single function called hsjobeki is suggesting that Nixpkgs could distinguish between a union of submodules by selecting the first one that can handle the definition without errors. That's probably a more useful default behavior, although it may have a performance cost and still wouldn't cover all scenarios. E.g. some scenarios don't have a sensible solution; how to handle a module-definition that doesn't define any options? Or defines options that'd be valid in multiple submodule configurations? Or a module that declares additional options? Or how to handle freeform submodules? | 19:15:24 | |
| 20:46:55 | |
| 17 Jan 2026 | ||
I can set internal on an option to make it usable only in nixpkgs. Is there any mechanism to do the opposite, where an option is unusable in-tree but still available to users? The use case is for an option that should be deprecated, but where the replacement is not yet stable enough to produce a warning and steer users toward it. But also, the replacement is widely used within nixpkgs already. | 02:25:32 | |
| warnings | 02:27:04 | |
internal doesn't not affect who can use an option. It only affects whether it is documented. It's effectively the same thing as visible = "shallow". | 12:30:52 | |
* internal doesn't affect who can use an option. It only affects whether it is documented. It's effectively the same thing as visible = "shallow". | 13:05:04 | |
| 18 Jan 2026 | ||
| 14:58:52 | ||
| 20:43:36 | ||
| 19 Jan 2026 | ||
| 21:20:37 | ||
| 21 Jan 2026 | ||
is there anything more specific than types.str I can use for a version number that I will later compare with lib.versionAtLeast? | 20:39:57 | |
| In string types we have The general solution is | 20:46:28 | |
yeah, I went with strMatching, but I was hoping to have a type matching exactly what versionAtLeast would accept, but I guess there's no such a thing | 20:50:21 | |
versionAtLeast under the hood uses builtins.compareVersions, which seems to accept anything, probably it has a last-resort method comparison that's just lexicographic comparison | 20:53:24 | |
| 22 Jan 2026 | ||
| I would say, at the very least types are part of the documentation, if you can give a more descriptive name even if there is no additional check, this might be worth it. (i-e. just aliasing the name my motivate someone else to add a check function later) | 11:28:54 | |