Development environment with nix-shell: Difference between revisions
Anna Aurora (talk | contribs) m Fixed indentation in code block. |
No edit summary |
||
Line 3: | Line 3: | ||
If you already have a nix package definition of your project it's easy: Just use <code>nix-shell</code> instead of <code>nix-build</code> and you will end up in a bash shell that reproduce the build-environment of your package. You can also override[https://nixos.org/nixpkgs/manual/#sec-pkg-override] your package in a <code>shell.nix</code> file to add test and coverage dependencies, that are not necessary for the actual build of the package, but that you want for your development environment. | If you already have a nix package definition of your project it's easy: Just use <code>nix-shell</code> instead of <code>nix-build</code> and you will end up in a bash shell that reproduce the build-environment of your package. You can also override[https://nixos.org/nixpkgs/manual/#sec-pkg-override] your package in a <code>shell.nix</code> file to add test and coverage dependencies, that are not necessary for the actual build of the package, but that you want for your development environment. | ||
But, if you don't (or you don't want to) have a package definition you can still use a nix-shell to provide a reproducible development environment. To do so, you have to create a <code>shell.nix</code> file at the root of your repository. For example, if you want to have | But, if you don't (or you don't want to) have a package definition you can still use a nix-shell to provide a reproducible development environment. To do so, you have to create a <code>shell.nix</code> file at the root of your repository. For example, if you want to have rustc with libraries and hello you can write: | ||
<syntaxhighlight lang="nix"> | <syntaxhighlight lang="nix"> | ||
{ pkgs ? import <nixpkgs> {} }: | { | ||
pkgs.mkShell { | pkgs ? import <nixpkgs> { }, | ||
}: | |||
pkgs.callPackage ( | |||
} | { | ||
mkShell, | |||
hello, | |||
rustc, | |||
pkg-config, | |||
openssl, | |||
}: | |||
mkShell { | |||
strictDeps = true; | |||
# host/target agnostic programs | |||
depsBuildBuild = [ | |||
hello | |||
]; | |||
# compilers & linkers & dependecy finding programs | |||
nativeBuildInputs = [ | |||
rustc | |||
pkg-config | |||
]; | |||
# libraries | |||
buildInputs = [ | |||
openssl | |||
]; | |||
} | |||
) { } | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Line 19: | Line 43: | ||
Now you have ruby 3.2 available in your shell: | Now you have ruby 3.2 available in your shell: | ||
< | <syntaxhighlight lang="bash"> | ||
$ | $ rustc --version | ||
rustc 1.80.1 (3f5fd8dd4 2024-08-06) (built from a source tarball) | |||
</ | </syntaxhighlight> | ||
To be sure that the tools installed on your system will not interfere with the dependencies that you've defined in the shell you can use the <code>--pure</code> option. | To be sure that the tools installed on your system will not interfere with the dependencies that you've defined in the shell you can use the <code>--pure</code> option. | ||
If you'd like to load a local nix expression into a shell you can do it by modifying the earlier example a little bit: | If you'd like to load a local nix expression into a shell you can do it by modifying the earlier example a little bit, see comments in the earlier example for where to put your package: | ||
< | <syntaxhighlight lang="nix"> | ||
{ pkgs ? import <nixpkgs> {} }: | { | ||
pkgs. | pkgs ? import <nixpkgs> { | ||
overlays = [ | |||
(final: prev: { | |||
buildInputs = [ | my-packages = prev.callPackage ./my-package.nix { }; | ||
}) | |||
]; | |||
} | }, | ||
</ | }: | ||
pkgs.callPackage ( | |||
{ | |||
mkShell, | |||
my-package | |||
}: | |||
mkShell { | |||
strictDeps = true; | |||
buildInputs = [ | |||
my-package | |||
]; | |||
} | |||
) { } | |||
</syntaxhighlight> | |||
If you want to see how to manually run the various phases of a given derivation from a nix-shell (useful to debug), see [[Nixpkgs/Create_and_debug_packages#Using_nix-shell_for_package_development]]. | If you want to see how to manually run the various phases of a given derivation from a nix-shell (useful to debug), see [[Nixpkgs/Create_and_debug_packages#Using_nix-shell_for_package_development]]. | ||
Line 96: | Line 133: | ||
Let's assume you have a <code>default.nix</code> file | Let's assume you have a <code>default.nix</code> file | ||
< | <syntaxhighlight lang="nix"> | ||
{ stdenv, python }: | { stdenv, python }: | ||
stdenv.mkDerivation { | stdenv.mkDerivation { | ||
pname = "some-package"; | |||
strictDeps = true; | |||
nativeBuildInputs = [ python ]; | |||
version = "0.0.1"; | version = "0.0.1"; | ||
src = /home/yourname/path/to/project; # can be a local path, or fetchFromGitHub, fetchgit, ... | src = /home/yourname/path/to/project; # can be a local path, or fetchFromGitHub, fetchgit, ... | ||
} | } | ||
</ | </syntaxhighlight> | ||
Then you can start a development shell with | Then you can start a development shell with | ||
Line 198: | Line 236: | ||
mkShell { | mkShell { | ||
... | ... | ||
strictDeps = true; | |||
buildInputs = [ gtk3 ]; | buildInputs = [ gtk3 ]; | ||
shellHook = '' | shellHook = '' |