Coder Social home page Coder Social logo

dyn's Introduction

dyn - kind of like a flake but not really

This is my personal module that I pass around from place to place. Its purpose is roughly:

  • create the system configuration through automatic discovery within the config directory
  • enforce some degree of layout convention in doing so
  • extend lib and make those extensions accessible to modules
  • pin everything that is auxiliary to the single system channel

Flakes could achieve everything this module does more intelligently and more consistently, but they're not first-class everywhere yet; for instance, on nix-darwin, a bootstrapping process is still required.

Basic Usage

Put this directory next to your configuration.nix, in which you set:

imports = import ./dyn {};

Something more involved on, say, a stable NixOS, might be:

imports = import ./dyn {
  unstable = /* your pinned nixos-unstable here */;
  imports = [ "${/* your pinned home-manager here */}/nixos" ];
};

In either case, you read that right - dyn presents as a list containing the real dyn module by default; it's just cleaner that way. Once you've done this, dyn will bring in everything it finds, including hardware-configuration.nix. More concretely, import ./dyn {} will evaluate to something that looks like this:

# paths are relative to your config directory
# see defaultExcludes in the list of options below
[ ({ lib, pkgs, ... }: {
  imports = (/* contents of ./dyn/modules */)
         ++ (/* contents of ./ except for excludes */);
  config.nixpkgs.overlays = (/* contents of ./dyn/overlays */)
                         ++ (/* contents of ./overlays */);
}) ]

All the modules in imports become modified such that when called by the module system, lib is replaced by a lib that has been extended with ./dyn/mylib, which is full of miscellaneous utilities.

Import Parameters

contrib : The search path outside of dyn. Default: ../. (as seen by dyn/default.nix)

excl : Basenames of nix files to exclude if found. Default: []

defaultExcludes : Whether to append the default list of excludes to excl. These are configuration.nix, darwin-configuration.nix, home.nix, and overlays. Regardless of this option, if contrib is left at its default, dyn will always be appended to excl. Default: true

imports : Additional explicit imports, typically nix store paths for pinned external modules. These need not be paths; they can be anything accepted by an imports list in a standard module (i.e. literal module definitions, with or without parameters). Default: []

unstable : The import path of an unstable nixpkgs, which becomes available as unstablePath in pkgs by way of an overlay. Default: null

others : Prevent dyn from wrapping itself in a list when imported. Default: false

contagious : Add dyn as a weird little library available as a module argument to “enhanced” modules, letting them perform “enhancement” themselves. Default: false

How It Works

The search process is specified in lib.nixFiles, which is defined and documented in mylib/default.nix. Roughly speaking, though, a given file tree is traversed, terminating at any file with a .nix extension, or any directory containing a default.nix. Regular files that don't end in .nix are ignored; directories without a default.nix are descended into.

The collection of leaves is flattened into a list of import paths for modules, or a list of imported values in the case of overlays. Overlays are expected to evaluate to individual overlay functions, not lists of them.

Because directories containing default.nix are considered black boxes by this system, they are the canonical means of sidestepping it. Anything in those directories is safe from its prying eyes unless explicitly used in that default.nix.

Considerations

The process of “enhancing” modules prior to import puts their canonical definition site at the imports list of dyn/default.nix, not their respective file paths. On occasion, this can make error messages more cryptic, though the Nix module system uses robust metadata and this usually isn't an issue.

Please do not consider the contents of dyn/{modules,overlays,mylib} to be immutable or set in stone; hack away. This is a personal project, and your needs are likely not the same as mine. The intention for the directories inside dyn is that they are shared between all the systems you work with, and the contents of the contrib path are site-specific.

Unfortunately, I can't document everything. The authoritative documentation is the source. That being said, the contents of dyn/{modules,overlays,mylib} give some good hints as to intended usage.

Lastly

This is a hack. A hack that attempts to discipline itself to the useful minimum of magic, but a hack nonetheless. This is a style of usage that is antithetical to some design intent of Nix/NixOS I've seen expressed, the same design intent that says there is no eval, only composing builtins.import and builtins.toFile, the same design intent that says automatic config file discovery seems like a horrible idea. It probably is a horrible idea for any real-world deployment that is not a personal workstation or server. Warranty disclaimers in licenses were written for this sort of thing. However, this whole mess makes my experience configuring my personal machines more pleasant, and in sharing it, my hope is that it does the same for you. Have fun!

dyn's People

Contributors

ylh avatar

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.