July 10th, 2024

Automate Project Environments with Devbox and Direnv

The article emphasizes the benefits of isolated project environments and introduces Devbox and Direnv as tools to automate environment management. It explains their features, integration, and simplification of setting up project environments.

Read original articleLink Icon
Automate Project Environments with Devbox and Direnv

The article discusses the importance of having isolated environments for projects and introduces Devbox and Direnv as tools to automate and manage project environments effectively. It highlights the challenges of managing multiple projects on the same operating system and explains how Devbox simplifies the process of creating isolated shell environments. Direnv is presented as a tool that automates environment configuration on a per-directory basis, making it easier to manage different environments and switch between them seamlessly. The integration of Devbox and Direnv eliminates the need to set up .envrc files manually, streamlining the process of initiating project environments. The article provides a step-by-step guide on setting up a sample project with Devbox and Direnv, showcasing how to automate starting a NodeJS project. By combining Devbox and Direnv, developers can create and work in isolated development environments efficiently, enhancing their workflow.

Link Icon 19 comments
By @arnorhs - 8 months
> The problem with using Direnv is that despite it being a very useful tool, its setup requires investing time and getting over the Nix ecosystem's learning curve.

I'm a bit confused. Direnv is rather simple, is it not.. ?

1. put env variables into .envrc 2. direnv allow

I don't use nix and I don't think I'm over its learning curve. I don't remember investing any time into it..

By @srid - 8 months
Direnv is very useful for switching between projects, we have an article: https://nixos.asia/en/direnv

But if you are comfortable with Nix you don't need Devbox per se, as you can get by with using Flakes. Here are some examples -- just `git clone` and run `direnv allow` (once), then you are put in the corresponding devShell

Haskell: https://github.com/srid/haskell-template

Rust: https://github.com/srid/rust-nix-template

home-manager: https://github.com/juspay/nix-dev-home

Dioxus: https://github.com/srid/dioxus-desktop-template

By @depingus - 8 months
I started messing around with Devbox a few weeks ago and I like it as a faster alternative to toolbox/distrobox containers. I've been adding my environment variables directly into the devbox.json file as normal EXPORT statements. From the article tho, I couldn't grasp what Direnv adds to this. Same Devbox shell, different environment variables per directory?
By @zamalek - 8 months
I try to contribute a lot, which has resulting in me adding .direnv and .envrc to my global gitignores (for other Nix+hm folks[1]). .direnv for obvious reasons, it's a cache, and doesn't frequently show up in project gitignores.

I add .envrc to not only avoid committing it to projects that don't use it, but also because it turns out that it's still pretty environment dependent. There's 100 different ways to skin the dependency problem: Nix, pipenv, nvm, rustup, etc. There's no telling which a contributor prefers to use, so .envrc doesn't belong in git IMHO. What could be committed is something like .envrc-flake (which can then be sourced into .envrc).

As for needing a flake in the repo, I have found a workaround. `use flake` accepts parameters, including the path to the flake. I have a bunch of shells[2] that I can import with e.g. `use flake ~/Nix#rust`.

[1]: https://codeberg.org/jcdickinson/nix/src/branch/main/home/co... [2]: https://codeberg.org/jcdickinson/nix/src/branch/main/flake.n...

By @aerzen - 8 months
This is the way. We should make it a standard practice for oss projects that one is able to git clone, direnv allow and build the project.

Regardless of the distro or even OS. An easy thing to say, but hard to execute on actual projects with patched versions of cPython and some obscure in-house build tool.

By @cquintana92 - 8 months
Been using Devbox recently both at work and for personal projects and I can only say good things. It abstracts away the complexity of nix, defining the dependencies in a simple json with a lock file, the shell starts quite fast and from then on you have everything under your PATH, and it works the same in macOS and Linux.

Also, as a benefit, by tracking the JSON and lockfile, the CI can work with the exact same environment. I highly recommend giving it a try.

By @Mathnerd314 - 8 months
> despite it being a very useful tool, its setup requires investing time and getting over the Nix ecosystem's learning curve.

They mention Nix but I guess they are referring to the use_nix integration built-in to direnv? There is a fairly detailed (but old) comparison in https://github.com/direnv/direnv/wiki/Nix#some-factors-to-co... and in the meantime lorri and nix-direnv are the only ones still maintained. But you aren't limited to Nix when using direnv, for example there is nvm. https://github.com/direnv/direnv/wiki/Node#using-nvm

Actually, the post's solution, besides being built on top of direnv, uses Devbox, which itself is built on top of Nix... https://www.jetify.com/devbox/docs/faq/#how-does-devbox-work So they are saying they are outside the Nix ecosystem when in fact they are in it. It is yet another set of nice scripts on top of Nix.

By @undecisive - 8 months
My experience of Devbox on Linux has been highly disappointing. I gave it a good go, had it running on my main project from February to May.

In case you hadn't realised, the very concept of having two sets of binary distributions on one machine, vying for superiority and the correct version of glibc... is fraught.

Most of my use was with rails projects, and I can't recommend it.

Coupled with an abstraction that tries to save you from Nix, but almost entirely fails, you end up with a bloated hellscape where every time you load your project it will unnecessarily reinstall your packages and several times an hour it will have forgotten curl exists and so you have to manually reinstall curl (not-so-slowly increasing your /nix folder's size), every week or two a new version of devbox completely changes the workarounds you need to do, and don't try to garbage collect nix or it will delete vital files, and you end up scrubbing it all and starting again.

In python, it overrode the path so I couldn't get it to reliably use the binaries in the venv. Pip and Python were using packages in different places and I couldn't get them to converge for love nor money.

The devbox team were great and really tried to get things working, but in the end I couldn't get it to work with enough stability to properly recommend it to my team, and if I wanted it to half-work for any substantial length of time I had to lock to a version of devbox.

Obviously, ymmv, please do give it a try, it's an impressive project. But my view is that it's trying to do something that is very very hard, and for that you need a very clever solution. And this is a very clever solution, with very clever bugs, and so it's not something I'd recommend jumping into with both feet.

By @weitzj - 8 months
Great project which you can also use as your package manager on your system. This works nice if your developers have a MacBook with an Arm processor and want to have the build process close to what you do in your ci server which might be a Linux amd64
By @queil - 8 months
I wrote myself a small tool for dev workspaces in containers: https://github.com/queil/rooz - still WIP but I've been using it for quite a while
By @jbverschoor - 8 months
I created container-shell with a similar goal in mind. It’s super light weight, but does not yet support a package manager. It simply gives you a shell using a specified docker image inside the current directory, isolating both software installs as well as the rest of your filesystem

https://github.com/jrz/container-shell

By @h1fra - 8 months
I think this is my biggest pet peeves when working on different projects. Plus port allocation conflict; if you have multiple docker databases or multiple project using the same default port it's not smooth and obviously changing port is not always an option on legacy projects :/
By @azaras - 8 months
Why do not use asdf?
By @Iridescent_ - 8 months
It looks quite smaller in scope than devenv (https://devenv.sh/)
By @crabbone - 8 months
This looks like a huge overkill to solve the problem that's while real, isn't really so difficult to solve with existing tools... Kind of reminds me of Jucero.

Also, any solution of this kind will inevitably introduce a number of new problems proportionate to the internal complexity of such solution. I.e. this is just asking for a lot of problems, while offering very little in return.

By @julius-fx - 8 months
Devbox is really interesting stuff, gonna try it out soon. Thank you!
By @minhdanh72 - 8 months
This is so cool. Thanks!