devenv 0.6: Generating containers and instant shell activation
After about two months of active development, I'm happy to announce devenv 0.6 is ready.
This release comes with the most notable improvements based on the feedback from existing users:
- Adding the ability to generate containers.
- Instant shell activation of the developer environment.
- Hosts and ceritifcates provisioning.
- New devenv.yaml options:
allowUnfree
andoverlays
.
Generating containers
While devenv shell
provides a simple native developer environment experience,
devenv container <name>
allows you to generate and copy OCI container into a registry.
Containers are a great way to distribute ready-made applications, leveraging platforms like fly.io to deploy them into production.
An example for Ruby:
{
name = "simple-ruby-app";
languages.ruby.enable = true;
languages.ruby.version = "3.2.1";
}
We can generate a container called shell
that enters the environment, copy it to the local Docker daemon and run it:
$ devenv container shell --docker-run
...
(devenv) bash-5.2# ruby --version
ruby 3.2.1 (2023-02-08 revision 31819e82c8) [x86_64-linux]
You can read more in the new Containers section of the documentation, specifically:
- How to generate a container for shell
- How to generate a container to start all processes
- How to generate a container to start a single process
- How to generate a container to start a custom built binary
- How to copy the containers to a registry
- How to conditionalize environment based on native/container target
Instant shell activation
Especially monorepo developer environments can sometimes be even a few gigabytes of size, taking a few seconds for the environment to be activated.
A developer environment should only be built when something changes and if not, the environment can be used instantly using a cached snapshot.
With the latest direnv.net integration, we've finally reached that goal by making caching work properly (it will even watch each of your imports for changes!).
Migrating from an older devenv
Make sure to use the latest .envrc
from devenv init
and for everyone on the team to upgrade to devenv 0.6.
In the near future we'll experiment to improve devenv shell experience.
Hosts and certificates
Hosts and certificates can now be specified declaratively:
{ pkgs, config, ... }:
{
certificates = [
"example.com"
];
hosts."example.com" = "127.0.0.1";
services.caddy.enable = true;
services.caddy.virtualHosts."example.com" = {
extraConfig = ''
tls ${config.env.DEVENV_STATE}/mkcert/example.com.pem ${config.env.DEVENV_STATE}/mkcert/example.com-key.pem
respond "Hello, world!"
'';
};
}
And when you run devenv up
to start the processes, these hosts and certificates will be provisioned locally.
allowUnfree
and overlays
For example in devenv.yaml
:
allowUnfree: true
inputs:
nixpkgs:
url: github:NixOS/nixpkgs/nixpkgs-unstable
rust-overlay:
url: github:oxalica/rust-overlay
overlays:
- default
Will allow building unfree software and wire up default
overlay into pkgs
from rust-overlay.
Migrating from an older devenv
Make sure everyone on the team upgrades to devenv 0.6.
Languages changelog
- Python: Added support for virtualenv creation and poetry by bobvanderlinden.
- Ruby: First-class support for setting
version
orversionFile
by bobvanderlinden. - Go: Received significant improvements by shyim.
- PHP: Added first-class support for setting version to make it easier to set extensions by shyim.
- Scala: Now allows changing the package and offers scala-cli as an option if the JDK is too old by domenkozar.
- R: Added an option to specify the package by adfaure.
- Rust: Can now find headers for darwin frameworks by domenkozar.
- OCaml: Allowed using a different version of OCaml by ankhers.
- Tex Live: Added support by BurNiinTRee.
- Swift: Added support by domenkozar.
- Raku: Added support by 0pointerexception.
- Gawk: Added support by 0pointerexception.
- Racket: Added support by totoroot.
- Dart: Added support by domenkozar.
- Julia: Added support by domenkozar.
- Crystal: Added support by bcardiff.
- Unison: Added support by ereslibre.
- Zig: Added support by ereslibre.
- Deno: Added support by janathandion.
Services changelog
-
Cassandra: Added by ankhers.
-
CouchDB: Added by MSBarbieri.
-
MariaDB: Corrected user and database handling by jochenmanz.
-
MinIO: Now allows specifying what buckets to provision by shyim.
Fixed issues and other improvements
-
process-compose: Faster shutdown, restart on failure by default, escape env variables properly by thenonameguy.
-
Support assertions in modules by bobvanderlinden.
-
Fix overmind root by domenkozar.
-
Make
devenv info
output pluggable from devenv modules by domenkozar. -
Expand the flake guide by sandydoo.
-
Set
LOCALE_ARCHIVE
when missing by sandydoo. -
Numerous option documentation fixes by sandydoo.
-
Fix starship integration with a custom config by domenkozar.
-
Test direnv integration with strict bash mode by stephank.
-
Add a shim
devenv
for flakes integration by rgonzalez.