devenv.sh
Fast, Declarative, Reproducible, and Composable Developer Environments
@domenkozar
Ruby Meetup Ljubljana 2024
Declarative
$ cat devenv.nix
{ pkgs, ... }:
{
env.GREET = "determinism";
packages = [ pkgs.git ];
enterShell = "echo hello $GREET";
}$ git --version
git: command not found
$ devenv shell
hello determinism
(devenv) $ git --version
git version 2.38.1
$ devenv search ncdu
...Declarative
$ cat devenv.nix
{ pkgs, ... }: {
languages.ruby = {
enable = true;
version = "3.3.5";
bundler.enable = true;
};
}$ devenv shell
(devenv) $ ruby -v
ruby 3.3.5 (2024-09-03 revision ef084cc8f4)
[x86_64-linux]
supports 53 languages
Processes
$ cat devenv.nix
{ pkgs, ... }:
{
processes = {
hello.exec = "while true; do echo hello && sleep 1; done";
ping.exec = "ping example.com";
};
}$ devenv up
Starting processes ...
20:37:44 system | ping.1 started (pid=4094686)
20:37:44 system | silly-example.1 started (pid=4094688)
20:37:44 silly-example.1 | hello
20:37:44 ping.1 | PING example.com (93.184.216.34) 56(84) bytes of data.
20:37:44 ping.1 | 64 bytes from 93.184.216.34 (93.184.216.34): icmp_seq=1 ttl=55 time=125 ms
20:37:45 silly-example.1 | hello
20:37:45 ping.1 | 64 bytes from 93.184.216.34 (93.184.216.34): icmp_seq=2 ttl=55 time=125 ms
...Services
$ cat devenv.nix
{ pkgs, ... }:
{
services.postgres = {
enable = true;
package = pkgs.postgresql_15;
initialDatabases = [{ name = "mydb"; }];
extensions = extensions: [
extensions.postgis
extensions.timescaledb
];
settings.shared_preload_libraries = "timescaledb";
initialScript = "CREATE EXTENSION timescaledb;";
};
}supports 32 services
What if any tool could be an option?
$ cat devenv.nix
{ pkgs, ... }:
{
scripts."myscript".exec = ''
curl "https://httpbin.org/get?$1" | jq '.args'
'';
hosts."example.com" = "127.0.0.1";
devcontainer.enable = true;
difftastic.enable = true;
starship.enable = true;
}Thanks! Get started:
domen@cachix.org / @domenkozar

https://devenv.sh
devenv.sh
By ielectric
devenv.sh
- 122