feat(wpcarro/blog): nix-shell (note to self)
Publishing another "note to self" Change-Id: If5d052f0360f3e1f371b0c1fdd3781e5bb846ea4 Reviewed-on: https://cl.tvl.fyi/c/depot/+/6861 Tested-by: BuildkiteCI Reviewed-by: wpcarro <wpcarro@gmail.com>
This commit is contained in:
		
							parent
							
								
									4a06f5d3b1
								
							
						
					
					
						commit
						ba22b09f71
					
				
					 2 changed files with 57 additions and 0 deletions
				
			
		|  | @ -57,4 +57,11 @@ | |||
|     content = ./posts/ssh-oddities.md; | ||||
|     draft = false; | ||||
|   } | ||||
|   { | ||||
|     key = "nix-shell"; | ||||
|     title = "nix-shell (note to self)"; | ||||
|     date = 1664902186; | ||||
|     content = ./posts/nix-shell-note.md; | ||||
|     draft = false; | ||||
|   } | ||||
| ] | ||||
|  |  | |||
							
								
								
									
										50
									
								
								users/wpcarro/website/blog/posts/nix-shell-note.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								users/wpcarro/website/blog/posts/nix-shell-note.md
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,50 @@ | |||
| ## Background | ||||
| 
 | ||||
| I rarely use `nix-shell` for its originally intended purpose of "reproducing the | ||||
| environment of a derivation for development". Instead, I often use it to put | ||||
| some executable on my `PATH` for some ad hoc task. | ||||
| 
 | ||||
| What's `nix-shell`'s "intended purpose"? Let's ask The Man (`man nix-shell`): | ||||
| 
 | ||||
| > The command nix-shell will build the dependencies of the specified derivation, | ||||
| > but not the derivation itself. It will then start an interactive shell in | ||||
| > which all environment variables defined by the derivation path have been set | ||||
| > to their corresponding values, and the script $stdenv/setup has been | ||||
| > sourced. This is useful for reproducing the environment of a derivation for | ||||
| > development. | ||||
| 
 | ||||
| Because I'm abusing `nix-shell` in this way, I'm liable to forget that | ||||
| `nix-shell` puts `buildInputs` on `PATH` and *not* the derivation itself. But I | ||||
| often only want the derivation! | ||||
| 
 | ||||
| ## Solution | ||||
| 
 | ||||
| Pass the Nix expression to `nix-shell -p`: | ||||
| 
 | ||||
| ```shell | ||||
| λ nix-shell -p '(import /depot {}).tvix.eval' | ||||
| ``` | ||||
| 
 | ||||
| ## Explanation | ||||
| 
 | ||||
| This works because Nix forwards the arguments passed to `-p` (i.e. `--packages`) | ||||
| and interpolates them into this expression here: [source](nix-src) | ||||
| 
 | ||||
| ```nix | ||||
| { ... }@args: | ||||
| 
 | ||||
| with import <nixpkgs> args; | ||||
| 
 | ||||
| (pkgs.runCommandCC or pkgs.runCommand) "shell" { | ||||
|   buildInputs = [ | ||||
|     # --packages go here | ||||
|   ]; | ||||
| } | ||||
| ``` | ||||
| 
 | ||||
| So really you can pass-in *any* valid Nix expression that produces a derivation | ||||
| and `nix-shell` will put their outputs on your `PATH`. | ||||
| 
 | ||||
| Enjoy! | ||||
| 
 | ||||
| [nix-src]: https://sourcegraph.com/github.com/NixOS/nix@3ae9467d57188f9db41f85b0e5c41c0c9d141955/-/blob/src/nix-build/nix-build.cc?L266 | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue