From 216328927ddae92ec8085fb73cf3ab44f7ad30e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Jane=C5=BEi=C4=8D?= Date: Thu, 9 Apr 2026 17:05:33 +0200 Subject: [PATCH] feat: improve dev-components with --extra --- features/dev.nix | 8 ++++---- features/direnv/use_dev.sh | 26 +++++++++++++++++++------- flake/dev-components.nix | 30 ++++-------------------------- 3 files changed, 27 insertions(+), 37 deletions(-) diff --git a/features/dev.nix b/features/dev.nix index feb5ceb..fe5dce1 100644 --- a/features/dev.nix +++ b/features/dev.nix @@ -9,16 +9,16 @@ pkgs.git packages.git-linearize packages.ggman + pkgs.python3 - pkgs.mdbook - pkgs.marksman - pkgs.mdformat + pkgs.osc + pkgs.google-cloud-sdk pkgs.google-cloud-sql-proxy + packages.ahab pkgs.just pkgs.presenterm - pkgs.osc ]; }; diff --git a/features/direnv/use_dev.sh b/features/direnv/use_dev.sh index 3eb8c55..f02633a 100644 --- a/features/direnv/use_dev.sh +++ b/features/direnv/use_dev.sh @@ -1,16 +1,28 @@ # shellcheck shell=bash # composable nix devshell from matej.nix -# usage in .envrc: use dev uv_14 pg_18 +# usage in .envrc: use dev uv_14 pg_18 --extra cairo pkg-config # generates a flake and delegates to use_flake at the calling scope use_dev() { - local nix_list="" + local nix_list="" extra_list="" in_extra=0 for c in "$@"; do - if [[ ! "$c" =~ ^[a-zA-Z_][a-zA-Z0-9_]*$ ]]; then - log_error "use_dev: invalid component name: $c" - return 1 + if [[ "$c" == "--extra" ]]; then + in_extra=1 + continue + fi + if [[ $in_extra -eq 1 ]]; then + if [[ ! "$c" =~ ^[a-zA-Z_][a-zA-Z0-9_-]*$ ]]; then + log_error "use_dev: invalid package name: $c" + return 1 + fi + extra_list="$extra_list pkgs.$c" + else + if [[ ! "$c" =~ ^[a-zA-Z_][a-zA-Z0-9_]*$ ]]; then + log_error "use_dev: invalid component name: $c" + return 1 + fi + nix_list="$nix_list \"$c\"" fi - nix_list="$nix_list \"$c\"" done local system @@ -64,7 +76,7 @@ use_dev() { pkgs = nixpkgs.legacyPackages.\${system}; devLib = import "\${dev}/flake/dev-components.nix" { inherit pkgs; lib = nixpkgs.lib; }; in { - devShells.\${system}.default = devLib.mkComponentShell [$nix_list ]; + devShells.\${system}.default = devLib.mkComponentShell [$nix_list ] [${extra_list} ]; }; } DEVFLAKE diff --git a/flake/dev-components.nix b/flake/dev-components.nix index f207925..27a5e91 100644 --- a/flake/dev-components.nix +++ b/flake/dev-components.nix @@ -8,6 +8,7 @@ let pkgs.zlib pkgs.openssl pkgs.curl + pkgs.libffi ]; mkNode = nodejs: { @@ -24,12 +25,12 @@ let packages = [ python pkgs.uv + pkgs.pkg-config ]; libraries = pythonLibraries; env = { UV_PYTHON_DOWNLOADS = "never"; UV_PYTHON_PREFERENCE = "only-system"; - UV_PYTHON = "${python}/bin/python"; }; shellHook = '' unset PYTHONPATH @@ -44,27 +45,10 @@ let uv_13 = mkUv pkgs.python313; uv_14 = mkUv pkgs.python314; - pg_15 = { - packages = [ pkgs.postgresql_15 ]; - }; - pg_16 = { - packages = [ pkgs.postgresql_16 ]; - }; - pg_17 = { - packages = [ pkgs.postgresql_17 ]; - }; - pg_18 = { - packages = [ pkgs.postgresql_18 ]; - }; - node_20 = mkNode pkgs.nodejs_20; node_22 = mkNode pkgs.nodejs_22; node_24 = mkNode pkgs.nodejs_24; - go = { - packages = [ pkgs.go ]; - }; - rust = { packages = [ pkgs.rustc @@ -75,20 +59,14 @@ let ]; }; - cmake = { - packages = [ - pkgs.cmake - pkgs.ninja - ]; - }; }; # build a single mkShell from one or more component names mkComponentShell = - names: + names: extraPackages: let selected = map (n: components.${n}) names; - allPackages = lib.concatMap (c: c.packages or [ ]) selected; + allPackages = lib.concatMap (c: c.packages or [ ]) selected ++ extraPackages; allLibraries = lib.concatMap (c: c.libraries or [ ]) selected; allHooks = lib.concatMapStrings (c: c.shellHook or "") selected; allEnvs = lib.foldl' (acc: c: acc // (c.env or { })) { } selected;