devshell

Simple per-project developer environments.

Example:

perSystem = { config, pkgs, ... }: { devshells.default = { env = [ { name = "HTTP_PORT"; value = 8080; } ]; commands = [ { help = "print hello"; name = "hello"; command = "echo hello"; } ]; packages = [ pkgs.cowsay ]; }; };

See also the devshell project page

Installation

To use these options, add to your flake inputs:

devshell.url = "github:numtide/devshell";

and inside the mkFlake:

imports = [ inputs.devshell.flakeModule ];

Run nix flake lock and you're set.

Options

perSystem.devshells

Configure devshells with flake-parts.

Not to be confused with devShells, with a capital S. Yes, this is unfortunate.

Each devshell will also configure an equivalent devShells.

Used to define devshells. not to be confused with devShells

Type: lazy attribute set of (submodule)

Default: { }

Declared by:

perSystem.devshells.<name>.commands

Add commands to the environment.

Type: list of (submodule)

Default: [ ]

Example:

[ { help = "print hello"; name = "hello"; command = "echo hello"; } { package = "nixpkgs-fmt"; category = "formatter"; } ]

Declared by:

perSystem.devshells.<name>.commands.*.package

Used to bring in a specific package. This package will be added to the environment.

Type: null or (package or string convertible to it)

Default: null

Declared by:

perSystem.devshells.<name>.commands.*.category

Set a free text category under which this command is grouped and shown in the help menu.

Type: string

Default: "[general commands]"

Declared by:

perSystem.devshells.<name>.commands.*.command

If defined, it will add a script with the name of the command, and the content of this value.

By default it generates a bash script, unless a different shebang is provided.

Type: null or string

Default: null

Example:

'' #!/usr/bin/env python print("Hello") ''

Declared by:

perSystem.devshells.<name>.commands.*.help

Describes what the command does in one line of text.

Type: null or string

Default: null

Declared by:

perSystem.devshells.<name>.commands.*.name

Name of this command. Defaults to attribute name in commands.

Type: null or string

Default: null

Declared by:

perSystem.devshells.<name>.devshell.packages

The set of packages to appear in the project environment.

Those packages come from https://nixos.org/NixOS/nixpkgs and can be searched by going to https://search.nixos.org/packages

Type: list of (package or string convertible to it)

Default: [ ]

Declared by:

perSystem.devshells.<name>.devshell.packagesFrom

Add all the build dependencies from the listed packages to the environment.

Type: list of (package or string convertible to it)

Default: [ ]

Declared by:

perSystem.devshells.<name>.devshell.interactive.<name>.deps

A list of other steps that this one depends on.

Type: list of string

Default: [ ]

Declared by:

perSystem.devshells.<name>.devshell.interactive.<name>.text

Script to run.

Type: string

Declared by:

perSystem.devshells.<name>.devshell.load_profiles

Whether to enable load etc/profiles.d/*.sh in the shell.

Type: boolean

Default: false

Example: true

Declared by:

perSystem.devshells.<name>.devshell.meta

Metadata, such as ‘meta.description’. Can be useful as metadata for downstream tooling.

Type: attribute set of anything

Default: { }

Declared by:

perSystem.devshells.<name>.devshell.motd

Message Of The Day.

This is the welcome message that is being printed when the user opens the shell.

You may use any valid ansi color from the 8-bit ansi color table. For example, to use a green color you would use something like {106}. You may also use {bold}, {italic}, {underline}. Use {reset} to turn off all attributes.

Type: string

Default:

'' {202}🔨 Welcome to devshell{reset} $(type -p menu &>/dev/null && menu) ''

Declared by:

perSystem.devshells.<name>.devshell.name

Name of the shell environment. It usually maps to the project name.

Type: string

Default: "devshell"

Declared by:

perSystem.devshells.<name>.devshell.prj_root_fallback

If IN_NIX_SHELL is nonempty, or DIRENV_IN_ENVRC is set to ‘1’, then PRJ_ROOT is set to the value of PWD.

This option specifies the path to use as the value of PRJ_ROOT in case IN_NIX_SHELL is empty or unset and DIRENV_IN_ENVRC is any value other than ‘1’.

Set this to null to force PRJ_ROOT to be defined at runtime (except if IN_NIX_SHELL or DIRENV_IN_ENVRC are defined as described above).

Otherwise, you can set this to a string representing the desired default path, or to a submodule of the same type valid in the ‘env’ options list (except that the ‘name’ field is ignored).

Type: null or ((submodule) or non-empty string convertible to it)

Default:

{ eval = "$PWD"; }

Example:

{ # Use the top-level directory of the working tree eval = "$(git rev-parse --show-toplevel)"; };

Declared by:

perSystem.devshells.<name>.devshell.prj_root_fallback.eval

Like value but not evaluated by Bash. This allows to inject other variable names or even commands using the $() notation.

Type: null or string

Default: null

Example: "$OTHER_VAR"

Declared by:

perSystem.devshells.<name>.devshell.prj_root_fallback.name

Name of the environment variable

Type: string

Declared by:

perSystem.devshells.<name>.devshell.prj_root_fallback.prefix

Prepend to PATH-like environment variables.

For example name = “PATH”; prefix = “bin”; will expand the path of ./bin and prepend it to the PATH, separated by ‘:’.

Type: null or string

Default: null

Example: "bin"

Declared by:

perSystem.devshells.<name>.devshell.prj_root_fallback.unset

Whether to enable unsets the variable.

Type: boolean

Default: false

Example: true

Declared by:

perSystem.devshells.<name>.devshell.prj_root_fallback.value

Shell-escaped value to set

Type: null or string or signed integer or boolean or package

Default: null

Declared by:

perSystem.devshells.<name>.devshell.startup.<name>.deps

A list of other steps that this one depends on.

Type: list of string

Default: [ ]

Declared by:

perSystem.devshells.<name>.devshell.startup.<name>.text

Script to run.

Type: string

Declared by:

perSystem.devshells.<name>.env

Add environment variables to the shell.

Type: list of (submodule)

Default: [ ]

Example:

[ { name = "HTTP_PORT"; value = 8080; } { name = "PATH"; prefix = "bin"; } { name = "XDG_CACHE_DIR"; eval = "$PRJ_ROOT/.cache"; } { name = "CARGO_HOME"; unset = true; } ]

Declared by:

perSystem.devshells.<name>.env.*.eval

Like value but not evaluated by Bash. This allows to inject other variable names or even commands using the $() notation.

Type: null or string

Default: null

Example: "$OTHER_VAR"

Declared by:

perSystem.devshells.<name>.env.*.name

Name of the environment variable

Type: string

Declared by:

perSystem.devshells.<name>.env.*.prefix

Prepend to PATH-like environment variables.

For example name = “PATH”; prefix = “bin”; will expand the path of ./bin and prepend it to the PATH, separated by ‘:’.

Type: null or string

Default: null

Example: "bin"

Declared by:

perSystem.devshells.<name>.env.*.unset

Whether to enable unsets the variable.

Type: boolean

Default: false

Example: true

Declared by:

perSystem.devshells.<name>.env.*.value

Shell-escaped value to set

Type: null or string or signed integer or boolean or package

Default: null

Declared by:

perSystem.devshells.<name>.serviceGroups

Add services to the environment. Services can be used to group long-running processes.

Type: attribute set of (submodule)

Default: { }

Declared by:

perSystem.devshells.<name>.serviceGroups.<name>.description

Short description of the service group, shown in generated commands

Type: null or string

Default: null

Declared by:

perSystem.devshells.<name>.serviceGroups.<name>.name

Name of the service group. Defaults to attribute name in groups.

Type: null or string

Default: null

Declared by:

perSystem.devshells.<name>.serviceGroups.<name>.services

Attrset of services that should be run in this group.

Type: attribute set of (submodule)

Default: { }

Declared by:

perSystem.devshells.<name>.serviceGroups.<name>.services.<name>.command

Command to execute.

Type: string

Declared by:

perSystem.devshells.<name>.serviceGroups.<name>.services.<name>.name

Name of this service. Defaults to attribute name in group services.

Type: null or string

Default: null

Declared by: