diff --git a/docs/nixos-with-flakes/modularize-the-configuration.md b/docs/nixos-with-flakes/modularize-the-configuration.md index 83c3e86..e32cf74 100644 --- a/docs/nixos-with-flakes/modularize-the-configuration.md +++ b/docs/nixos-with-flakes/modularize-the-configuration.md @@ -83,96 +83,6 @@ For example, [ryan4yin/nix-config/v0.0.2](https://github.com/ryan4yin/nix-config └── wallpaper.jpg # wallpaper ``` -For more details, see [ryan4yin/nix-config/v0.0.2](https://github.com/ryan4yin/nix-config/tree/v0.0.2). - -## `lib.mkOverride`, `lib.mkDefault`, and `lib.mkForce` - -Some people use `lib.mkDefault` and `lib.mkForce` to define values in Nix files. As their names suggest, `lib.mkDefault` and `lib.mkForce` are used to set default values or force values of options. - -You can read the source code of `lib.mkDefault` and `lib.mkForce` by running `nix repl -f ''` and then entering `:e lib.mkDefault`. To learn the basic usage of `nix repl`, type `:?` to see the help information. - -Here's the source code: - -```nix - # ...... - - mkOverride = priority: content: - { _type = "override"; - inherit priority content; - }; - - mkOptionDefault = mkOverride 1500; # priority of option defaults - mkDefault = mkOverride 1000; # used in config sections of non-user modules to set a default - mkImageMediaOverride = mkOverride 60; # image media profiles can be derived by inclusion into host config, hence needing to override host config, but do allow user to mkForce - mkForce = mkOverride 50; - mkVMOverride = mkOverride 10; # used by ‘nixos-rebuild build-vm’ - - # ...... -``` - -`lib.mkDefault` is used to set default values of options with a priority of 1000 internally, while `lib.mkForce` is used to force values of options with a priority of 50 internally. If you set a value of an option directly, it will be set with a default priority of 1000 (the same as `lib.mkDefault`). - -The lower the `priority` value, the higher the actual priority. Therefore, `lib.mkForce` has a higher priority than `lib.mkDefault`. If you define multiple values with the same priority, Nix will throw an error. - -These functions are useful for modularizing the configuration. You can set default values in a low-level module (base module) and force values in a high-level module. - -As an example, in my configuration , I define default values here: - -```nix -{ lib, pkgs, ... }: - -{ - # ...... - - nixpkgs.config.allowUnfree = lib.mkDefault false; - - # ...... -} -``` - -And for my dekstop machine, I force the values to another value in : - -```nix -{ lib, pkgs, ... }: - -{ - # import the base module - imports = [ - ./core-server.nix - ]; - - # override the default value defined in the base module - nixpkgs.config.allowUnfree = lib.mkForce true; - - # ...... -} -``` - -## `lib.mkOrder`, `lib.mkBefore`, and `lib.mkAfter` - -`lib.mkBefore` and `lib.mkAfter` are used to set the merge order of **list-type options**. Like `lib.mkDefault` and `lib.mkForce`, they're also useful for modularizing the configuration. - -As I mentioned earlier, if you define multiple values with the same **override priority**, Nix will throw an error. However, with `lib.mkOrder`, `lib.mkBefore`, or `lib.mkAfter`, you can define multiple values with the same override priority, and they will be merged in the order you defined. - -To take a look at the source code of `lib.mkBefore`, run `nix repl -f ''` and then enter `:e lib.mkBefore`. To learn the basic usage of `nix repl`, type `:?` to see the help information: - -```nix - # ...... - - mkOrder = priority: content: - { _type = "order"; - inherit priority content; - }; - - mkBefore = mkOrder 500; - mkAfter = mkOrder 1500; - - # The default priority for things that don't have a priority specified. - defaultPriority = 100; - - # ...... -``` - For more details, you can refer to the [ryan4yin/nix-config/v0.0.2](https://github.com/ryan4yin/nix-config/tree/v0.0.2) repository. ## `lib.mkOverride`, `lib.mkDefault`, and `lib.mkForce`