devShells
The devShells
option allows you to set additional devShell
outputs. The values each shell can be set to are the same as described above for the devShell
option.
Usage
For example, using the configuration options:
{
inputs.conflake.url = "github:ratson/conflake";
outputs = { conflake, ... }:
conflake ./. {
devShells.testing = {
packages = pkgs: [ pkgs.coreutils ];
env.TEST_VAR = "in testing shell";
};
};
}
For example, using a package definition:
{
inputs.conflake.url = "github:ratson/conflake";
outputs = { conflake, ... }:
conflake ./. {
devShells.testing = { mkShell, coreutils }:
mkShell {
packages = [ coreutils ];
env.TEST_VAR = "in testing shell";
};
};
}
The above flakes export devShells.${system}.testing
outputs.
devShell
The devShell
options allow you to configure devShells.${system}.default
. It is split up into options in order to enable multiple modules to contribute to its configuration.
devShell
can alternatively be set to a package definition or derivation, which is then used as the default shell, overriding other options.
devShell
can also be set to a function that takes the package set and returns an attrSet of the devShell configuration options or a derivation.
The options available are as follows:
devShell.packages
is a list of packages to add to the shell. It can optionally be a function taking the package set and returning such a list.
devShell.inputsFrom
is a list of packages whose deps should be in the shell. It can optionally be a function taking the package set and returning such a list.
devShell.shellHook
is a string that provides bash code to run in shell initialization. It can optionally be a function taking the package set and returning such a string.
devShell.hardeningDisable
is a list of hardening options to disable. Setting it to ["all"]
disables all Nix hardening.
devShell.env
is for setting environment variables in the shell. It is an attribute set mapping variables to values. It can optionally be a function taking the package set and returning such an attribute set.
devShell.stdenv
is the stdenv package used for the shell. It can optionally be a function taking the package set and returning the stdenv to use.
Usage
For example, these can be configured as follows:
{
inputs.conflake.url = "github:ratson/conflake";
outputs = { conflake, ... }:
conflake ./. {
devShell = pkgs: {
# Include build deps of emacs
inputsFrom = [ pkgs.emacs ];
# Add coreutils to the shell
packages = [ pkgs.coreutils ];
# Add shell hook. Can be a function if you need packages
shellHook = ''
echo Welcome to example shell!
'';
# Set an environment var. `env` can be an be a function
env.TEST_VAR = "test value";
stdenv = pkgs.clangStdenv;
};
};
}
The above exports devShells.${system}.default
outputs.
To add the build inputs of one of your packages, you can do as follows:
{
inputs.conflake.url = "github:ratson/conflake";
outputs = { conflake, ... }:
conflake ./. {
package = { stdenv }:
stdenv.mkDerivation {
pname = "pkg1";
version = "0.0.1";
src = ./.;
installPhase = "make DESTDIR=$out install";
};
devShell = {
inputsFrom = pkgs: [ pkgs.pkg1 ];
};
};
}
To override the devShell, you can use a package definition as such:
{
inputs.conflake.url = "github:ratson/conflake";
outputs = { conflake, ... }:
conflake ./. {
devShell = { mkShell, hello }: mkShell {
packages = [ hello ];
};
};
}