Centralized nix code
Simple example:
{
description = "Nix environment for development";
inputs.nix-template.url = "github:hazelweakly/nix-environments";
outputs = { nix-template, ... }: nix-template.lib.mkFlake {
projectName = "example";
src = ./.;
packages = pkgs: [];
preset.base = {
enable = true;
pre-commit-hooks = {};
shellHooks = {};
shellArgs = {};
checks = {};
overlays = {};
};
};
}
Accessing generated outputs to put into other inputs:
{
description = "Nix environment for development";
inputs.nix-template.url = "github:hazelweakly/nix-environments";
outputs = { self, nix-template, ... }: nix-template.lib.mkFlake (system:
# This pkgs will have the result of all overlays declared below available
# to use.
let pkgs = self.legacyPackages.${system}; in
{
projectName = "example";
src = ./.;
packages = pkgs: [];
preset.base = {
enable = true;
pre-commit-hooks = {};
shellHooks = {};
shellArgs = {};
checks = {};
overlays = {};
};
});
}
Inside an empty directory, run:
git init
nix flake template -t 'github:hazelweakly/nix-environments#templates.<template>'
where <template>
is one of the templates available in the nix flake.
At the time of writing, the list is base
, clojure
,react
,react-native
, python
, and hcl
.
If you don't specify the template, it'll default to the default template, which is the base template.
If you want to fork this repo and make it private (in order to add custom modules to it or your own custom logic), you'll need to consume it with a personal access token, or nix will be grumpy that you're wanting it to clone a private repo.
To consume this as a private repo, you'll need to set up a personal access token where nix can read it.
- Make a PAT in GitHub by going here.
- Use the permissions
repo
. - Set the expiration date for
90 days
.
- Copy the PAT and save it in a password manager somewhere
- Take the PAT and write it in
~/.config/nix/nix.conf
like so:access-tokens = github.com=$token_goes_here
Test this by running the command nix flake prefetch github:hazelweakly/nix-environments
. It should work.
The flake takes two types of configuration: Global configuration and preset configurations.
The preset
configurations are logical units of bundled defaults: often presets will be for a specific language or framework.
Presets are not intended to map 1:1 to any specific project; they are intended to be composed and require very little overriding or customization (if any).
They will be glued together along with the global configuration in order to form the final flake and dev shell environment.
Specifying presets in this way allows for defaults specific to that language, framework, or whatever else to be wired in but still overridden as needed.
- Project name (the repo name in GitHub)
- src should point to
./.
- It can be set explicitly to
null
in order to avoid copying the repo into the nix store. Do note that nix flakes typically copy the repo into the nix store anyway so there's not much point to setting it tonull
yet.
- It can be set explicitly to
- packages: anything else to add to the dev shell
enable
: whether to enable that set of defaultspre-commit-hooks
: add hooks or override provided onesshellHooks
: add hooks or override provided ones. These get concatenated together to form a singleshellHook
script.shellArgs
: raw arguments that are passed into the developer shell. This allows for low level overriding of defaults or adding special configuration as needed.checks
: add checks or override provided ones (note: we don't currently use checks anywhere, but eventually this is what will be used to run pre-commit-hooks in CI)overlays
: add or override provided overlays
The defaults are designed to be sufficient and mostly complete.
All the big scary dragons are hiding in the ./lib/modules
folder.