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