feat: improve dev-components with --extra

This commit is contained in:
2026-04-09 17:05:33 +02:00
parent 86e8fe7397
commit 216328927d
3 changed files with 27 additions and 37 deletions

View File

@@ -9,16 +9,16 @@
pkgs.git pkgs.git
packages.git-linearize packages.git-linearize
packages.ggman packages.ggman
pkgs.python3 pkgs.python3
pkgs.mdbook pkgs.osc
pkgs.marksman
pkgs.mdformat
pkgs.google-cloud-sdk pkgs.google-cloud-sdk
pkgs.google-cloud-sql-proxy pkgs.google-cloud-sql-proxy
packages.ahab packages.ahab
pkgs.just pkgs.just
pkgs.presenterm pkgs.presenterm
pkgs.osc
]; ];
}; };

View File

@@ -1,16 +1,28 @@
# shellcheck shell=bash # shellcheck shell=bash
# composable nix devshell from matej.nix # 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 # generates a flake and delegates to use_flake at the calling scope
use_dev() { use_dev() {
local nix_list="" local nix_list="" extra_list="" in_extra=0
for c in "$@"; do for c in "$@"; do
if [[ ! "$c" =~ ^[a-zA-Z_][a-zA-Z0-9_]*$ ]]; then if [[ "$c" == "--extra" ]]; then
log_error "use_dev: invalid component name: $c" in_extra=1
return 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 fi
nix_list="$nix_list \"$c\""
done done
local system local system
@@ -64,7 +76,7 @@ use_dev() {
pkgs = nixpkgs.legacyPackages.\${system}; pkgs = nixpkgs.legacyPackages.\${system};
devLib = import "\${dev}/flake/dev-components.nix" { inherit pkgs; lib = nixpkgs.lib; }; devLib = import "\${dev}/flake/dev-components.nix" { inherit pkgs; lib = nixpkgs.lib; };
in { in {
devShells.\${system}.default = devLib.mkComponentShell [$nix_list ]; devShells.\${system}.default = devLib.mkComponentShell [$nix_list ] [${extra_list} ];
}; };
} }
DEVFLAKE DEVFLAKE

View File

@@ -8,6 +8,7 @@ let
pkgs.zlib pkgs.zlib
pkgs.openssl pkgs.openssl
pkgs.curl pkgs.curl
pkgs.libffi
]; ];
mkNode = nodejs: { mkNode = nodejs: {
@@ -24,12 +25,12 @@ let
packages = [ packages = [
python python
pkgs.uv pkgs.uv
pkgs.pkg-config
]; ];
libraries = pythonLibraries; libraries = pythonLibraries;
env = { env = {
UV_PYTHON_DOWNLOADS = "never"; UV_PYTHON_DOWNLOADS = "never";
UV_PYTHON_PREFERENCE = "only-system"; UV_PYTHON_PREFERENCE = "only-system";
UV_PYTHON = "${python}/bin/python";
}; };
shellHook = '' shellHook = ''
unset PYTHONPATH unset PYTHONPATH
@@ -44,27 +45,10 @@ let
uv_13 = mkUv pkgs.python313; uv_13 = mkUv pkgs.python313;
uv_14 = mkUv pkgs.python314; 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_20 = mkNode pkgs.nodejs_20;
node_22 = mkNode pkgs.nodejs_22; node_22 = mkNode pkgs.nodejs_22;
node_24 = mkNode pkgs.nodejs_24; node_24 = mkNode pkgs.nodejs_24;
go = {
packages = [ pkgs.go ];
};
rust = { rust = {
packages = [ packages = [
pkgs.rustc pkgs.rustc
@@ -75,20 +59,14 @@ let
]; ];
}; };
cmake = {
packages = [
pkgs.cmake
pkgs.ninja
];
};
}; };
# build a single mkShell from one or more component names # build a single mkShell from one or more component names
mkComponentShell = mkComponentShell =
names: names: extraPackages:
let let
selected = map (n: components.${n}) names; 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; allLibraries = lib.concatMap (c: c.libraries or [ ]) selected;
allHooks = lib.concatMapStrings (c: c.shellHook or "") selected; allHooks = lib.concatMapStrings (c: c.shellHook or "") selected;
allEnvs = lib.foldl' (acc: c: acc // (c.env or { })) { } selected; allEnvs = lib.foldl' (acc: c: acc // (c.env or { })) { } selected;