1
0
Fork 0
mirror of https://github.com/NixOS/nix.dev.git synced 2024-10-18 14:32:43 -04:00
nix.dev/source/guides/recipes/sharing-dependencies.md
Valentin Gagarin 5ec1a4967c use nixShellNoCC in tutorials and guides
in our examples we never actually use the compiler toolchain stuff from
`mkShell`, so we may as well not burden users with large downloads.
2024-02-06 21:16:17 +01:00

2.6 KiB

(sharing-dependencies)=

Dependencies in the development shell

When packaging software in default.nix, you'll want a development environment in shell.nix to enter it conveniently with nix-shell or automatically with direnv.

How to share the package's dependencies in default.nix with the development environment in shell.nix?

Summary

Use the inputsFrom attribute to pkgs.mkShellNoCC:

# default.nix
let
  pkgs = import <nixpkgs> {};
  build = pkgs.callpackage ./build.nix {};
in
{
  inherit build;
  shell = pkgs.mkShellNoCC {
    inputsFrom = [ build ];
  };
}

Import the shell attribute in shell.nix:

# shell.nix
(import ./.).shell

Complete example

Assume your build is defined in build.nix:

# build.nix
{ cowsay, runCommand }:
runCommand "cowsay-output" { buildInputs = [ cowsay ]; } ''
  cowsay Hello, Nix! > $out
''

In this example, cowsay is declared as a build-time dependency using buildInputs.

Further assume your project is defined in default.nix:

# default.nix
let
  nixpkgs = fetchTarball "https://github.com/NixOS/nixpkgs/tarball/nixos-22.11";
  pkgs = import nixpkgs { config = {}; overlays = []; };
in
{
  build = pkgs.callPackage ./build.nix {};
}

Add an attribute to default.nix specifying an environment:

 let
   nixpkgs = fetchTarball "https://github.com/NixOS/nixpkgs/tarball/nixos-22.11";
   pkgs = import nixpkgs { config = {}; overlays = []; };
 in
 {
   build = pkgs.callPackage ./build.nix {};
+  shell = pkgs.mkShellNoCC {
+  };
 }

Move the build attribute into the let binding to be able to re-use it. Then take the package's dependencies into the environment with inputsFrom:

 let
   nixpkgs = fetchTarball "https://github.com/NixOS/nixpkgs/tarball/nixos-22.11";
   pkgs = import nixpkgs { config = {}; overlays = []; };
+  build = pkgs.callPackage ./build.nix {};
 in
 {
-  build = pkgs.callPackage ./build.nix {};
+  inherit build;
   shell = pkgs.mkShellNoCC {
+    inputsFrom = [ build ];
   };
 }

Finally, import the shell attribute in shell.nix:

# shell.nix
(import ./.).shell

Check the development environment, it contains the build-time dependency cowsay:

$ nix-shell --pure
[nix-shell]$ cowsay shell.nix

Next steps