Hacker News new | past | comments | ask | show | jobs | submit login
How to Learn Nix, Part 47: New and unimproved shells (ianthehenry.com)
30 points by todsacerdoti on May 17, 2022 | hide | past | favorite | 12 comments



By itself, "nix develop" is somewhat less nice than "nix-shell" was.. except, I kinda think the intended UX is to use direnv. direnv + nix devshells is super neat.

The DX of being able to just have the development dependencies of a project available (but without being stuck inside a container/VM) is neat.

Since the devshells are provided in nix flakes, they're also much easier to refer to compared to shell.nix files.

As a fish shell user, I also like that `nix shell` respects `$SHELL`. It's a nicer UX than "nix-shell -p <whatever> --command 'fish'".

The only thing I miss from nix-shell was the `#!nix-shell`, which would let nix-shell 'interpret' a file.. so you could describe what packages a script file needed to run in the script file itself.


>As a fish shell user, I also like that `nix shell` respects `$SHELL`. It's a nicer UX than "nix-shell -p <whatever> --command 'fish'".

And this would, of course, also help the zsh using author.

In general it's a great idea to uncouple $SHELL as "the user's preferred interactive shell" from "a shell to run some of our scripts with", and you'd be surprised at how many things get this wrong. Many vim plugins, for instance, do!


> The only thing I miss from nix-shell was the `#!nix-shell`, which would let nix-shell 'interpret' a file

The ergonomics arent as nice, but I've done with with a wrapper script. e.g. foo_wrapper.sh:

    #!/usr/bin/env bash

    nix shell nixpkgs#bash nixpkgs#{foo-pkg} nixpkgs#{bar-pkg} -c bash foo.sh $@


IMO the absence of a `--pure` flag (the `-i` flag seems not to work in the same way) makes `nix develop` an unsuitable replacement for `nix-shell`. A few SO threads and nixpkgs issues seem to agree, but if I'm misunderstanding I'd love to learn more.


> IMO the absence of a `--pure` flag (the `-i` flag seems not to work in the same way) makes `nix develop` an unsuitable replacement for `nix-shell`

Ah, right, this is a useful use-case that nix develop doesn't cover.


To be clear, nix-shell --pure serves this use case by accident; it basically drops you into the shell with generic-builder.sh sourced and the build environment for a Nix derivation. This is useful for debugging Nix derivations, and if you are using mkShell you can minimize the pollution, but it's not exactly a development environment tailored for the typical software-engineering workflow.

The tool that (ab)uses nix-shell/nix shell to get this right is devshell [1], which creates an activation script (similar to NixOS itself) that provides a real reproducible development env which works with shells other than bash.

[1] https://github.com/numtide/devshell


It looks like `--store` might be a way to get this, but I'm not sure if thats cross-platform.


`nix develop --store`?

I'm not seeing anything about it (on mobile at least):

- https://nixos.org/manual/nix/unstable/command-ref/new-cli/ni...

- https://nixos.wiki/wiki/Nix_command/develop


Its actually part of the nix config, which is also able to be overridden in the CLI: https://nixos.org/manual/nix/stable/command-ref/conf-file.ht...

Note this will bust your local cache as well as the hydra cache since I'm pretty sure they depend on the store prefix.


Gotcha, thanks.

Not sure how this would help replace `--pure` though.


Yeah now that I think about it youre right :D

It would only "purify" your nix dependencies, but wouldnt purify your environmental ones necessarily.


Note that this was written against nix 2.4. I'm not sure if it will make a difference for the use-cases outlined, but I recently upgraded to 2.8 from 2.4-2.7 on various machines. I found the whole experience much nicer overall specifically with flakes on a mac.




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: