NixOS Module System | 150 Members | |
| 28 Servers |
| Sender | Message | Time |
|---|---|---|
| 14 Jan 2026 | ||
| If you want to help out, doing some PRs i'm happy to answer questions | 07:30:58 | |
| * bake.monorail: Thanks for asking this here. I have some similar ideas. This is currently a limitation of the type system. We don't have explicit union discriminators. Because we currently use There are some action points that i'd like to accomplish and one needs to figure out the order of them:
| 07:36:00 | |
| * bake.monorail: Thanks for asking this here. I have some similar ideas. This is currently a limitation of the type system. We don't have explicit union discriminators. Because we currently use There are some action points that i'd like to accomplish and one needs to figure out the order of them:
| 07:41:34 | |
| 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 | |