aboutsummaryrefslogtreecommitdiff
path: root/src/nix/develop.md
blob: 4e8542d1bba0d8927edba0248c9ff26f1c22c91b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
R""(

# Examples

* Start a shell with the build environment of the default package of
  the flake in the current directory:

  ```console
  # nix develop
  ```

  Typical commands to run inside this shell are:

  ```console
  # configurePhase
  # buildPhase
  # installPhase
  ```

  Alternatively, you can run whatever build tools your project uses
  directly, e.g. for a typical Unix project:

  ```console
  # ./configure --prefix=$out
  # make
  # make install
  ```

* Run a particular build phase directly:

  ```console
  # nix develop --unpack
  # nix develop --configure
  # nix develop --build
  # nix develop --check
  # nix develop --install
  # nix develop --installcheck
  ```

* Start a shell with the build environment of GNU Hello:

  ```console
  # nix develop nixpkgs#hello
  ```

* Record a build environment in a profile:

  ```console
  # nix develop --profile /tmp/my-build-env nixpkgs#hello
  ```

* Use a build environment previously recorded in a profile:

  ```console
  # nix develop /tmp/my-build-env
  ```

* Replace all occurrences of the store path corresponding to
  `glibc.dev` with a writable directory:

  ```console
  # nix develop --redirect nixpkgs#glibc.dev ~/my-glibc/outputs/dev
  ```

  Note that this is useful if you're running a `nix develop` shell for
  `nixpkgs#glibc` in `~/my-glibc` and want to compile another package
  against it.

* Run a series of script commands:

  ```console
  # nix develop --command bash -c "mkdir build && cmake .. && make"
  ```

# Description

`nix develop` starts a `bash` shell that provides an interactive build
environment nearly identical to what Nix would use to build
*installable*. Inside this shell, environment variables and shell
functions are set up so that you can interactively and incrementally
build your package.

Nix determines the build environment by building a modified version of
the derivation *installable* that just records the environment
initialised by `stdenv` and exits. This build environment can be
recorded into a profile using `--profile`.

The prompt used by the `bash` shell can be customised by setting the
`bash-prompt`, `bash-prompt-prefix`, and `bash-prompt-suffix` settings in
`nix.conf` or in the flake's `nixConfig` attribute.

# Flake output attributes

If no flake output attribute is given, `nix develop` tries the following
flake output attributes:

* `devShells.<system>.default`

* `packages.<system>.default`

If a flake output *name* is given, `nix develop` tries the following flake
output attributes:

* `devShells.<system>.<name>`

* `packages.<system>.<name>`

* `legacyPackages.<system>.<name>`

)""