Files
minne/nix/dev-shell.nix
T
Per Stark 1f0c7d4e51 dev: devenv deprecation
removed devenv in favor for plain nix, implemented using flake-parts
2026-06-28 22:27:14 +02:00

173 lines
5.1 KiB
Nix

# Local development shell, git hooks, and process-compose runner.
{ inputs, ... }:
{
perSystem =
{
pkgs,
lib,
system,
minneCtx,
...
}:
let
inherit (minneCtx) rustToolchain surrealdbPkg devGraphicsLibs;
ortDylib =
if pkgs.stdenv.isDarwin then
"${pkgs.onnxruntime}/lib/libonnxruntime.dylib"
else
"${pkgs.onnxruntime}/lib/libonnxruntime.so";
processComposeFile = pkgs.writeText "minne-process-compose.yaml" ''
version: "0.5"
environment:
- MINIO_ROOT_USER=minioadmin
- MINIO_ROOT_PASSWORD=minioadmin
- MINIO_REGION=us-east-1
processes:
surreal_db:
command: |
mkdir -p database
exec ${surrealdbPkg}/bin/surreal start \
--bind 127.0.0.1:8000 \
--log info \
--user root_user \
--pass root_password \
rocksdb:database/database.db
availability:
restart: on_failure
tailwind:
command: ${pkgs.tailwindcss_4}/bin/tailwindcss --cwd html-router -i app.css -o assets/style.css --watch=always
availability:
restart: on_failure
minio:
command: |
mkdir -p .data/minio
exec ${pkgs.minio}/bin/minio server .data/minio \
--address 127.0.0.1:19000 \
--console-address 127.0.0.1:19001
availability:
restart: on_failure
minio_setup:
command: |
for _ in $(seq 1 30); do
if ${pkgs.minio-client}/bin/mc alias set local http://127.0.0.1:19000 minioadmin minioadmin 2>/dev/null; then
${pkgs.minio-client}/bin/mc mb local/minne-tests --ignore-existing
exit 0
fi
sleep 1
done
echo "minio did not become ready" >&2
exit 1
depends_on:
minio:
condition: process_started
'';
processComposeRunner = pkgs.writeShellScriptBin "minne-dev-up" ''
set -euo pipefail
root="''${MINNE_ROOT:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}"
cd "$root"
exec ${pkgs.process-compose}/bin/process-compose up -f ${processComposeFile} "$@"
'';
moldFlags = if pkgs.stdenv.isLinux then "-C link-arg=-fuse-ld=mold" else "";
preCommitCheck = inputs.git-hooks.lib.${system}.run {
src = inputs.self;
hooks = {
rustfmt.enable = true;
clippy = {
enable = true;
settings.allFeatures = true;
};
nixfmt.enable = true;
};
tools = {
cargo = rustToolchain.toolchain;
clippy = rustToolchain.toolchain;
rustfmt = rustToolchain.toolchain;
nixfmt = pkgs.nixfmt;
};
};
installGitHooks = ''
legacy="$(git rev-parse --git-path hooks/pre-commit.legacy 2>/dev/null || true)"
if [ -n "$legacy" ] && [ -f "$legacy" ]; then
rm -f "$legacy"
fi
# prek migration can leave core.hooksPath set; pre-commit refuses to install then.
hooks_path="$(git config --local --get core.hooksPath 2>/dev/null || true)"
if [ -n "$hooks_path" ]; then
git config --local --unset-all core.hooksPath
fi
'';
devPackages = [
rustToolchain.toolchain
surrealdbPkg
processComposeRunner
pkgs.process-compose
pkgs.minio
pkgs.minio-client
pkgs.openssl
pkgs.nodejs
pkgs.watchman
pkgs.vscode-langservers-extracted
pkgs.cargo-xwin
pkgs.clang
pkgs.onnxruntime
pkgs.cargo-watch
pkgs.tailwindcss_4
pkgs.python3
pkgs.fontconfig
pkgs.fontconfig.dev
pkgs.libGL
pkgs.libGLU
pkgs.libclang
pkgs.mold
pkgs.nixfmt
];
devEnv = {
NIX_CFLAGS_COMPILE = "-Wno-error=cpp";
LIBCLANG_PATH = "${pkgs.libclang.lib}/lib";
LD_LIBRARY_PATH = lib.makeLibraryPath devGraphicsLibs;
ORT_DYLIB_PATH = ortDylib;
S3_ENDPOINT = "http://127.0.0.1:19000";
S3_BUCKET = "minne-tests";
MINNE_TEST_S3_ENDPOINT = "http://127.0.0.1:19000";
MINNE_TEST_S3_BUCKET = "minne-tests";
RUSTFLAGS = moldFlags;
MINNE_ROOT = "${inputs.self}";
};
in
{
packages.process-compose-runner = processComposeRunner;
apps.dev = {
type = "app";
program = "${processComposeRunner}/bin/minne-dev-up";
meta.description = "Start local dev services (SurrealDB, MinIO, Tailwind)";
};
devShells.default = pkgs.mkShell {
packages = devPackages;
env = devEnv;
shellHook = ''
${preCommitCheck.shellHook}
${installGitHooks}
echo "Minne dev shell (fenix ${rustToolchain.rustVersion})"
echo " nix run .#dev # or: minne-dev-up"
echo " cargo test --workspace"
echo " nix flake check"
'';
};
};
}