Add flake.templates, justfile, and .envrc for direnv

Compared this template against the older nix-templates/templates/rust
("rrrr") ahead of eventually replacing it. Ported the pieces that were
genuinely missing and non-controversial:

- flake.templates.default, so `nix flake init -t <url>` works once
  this repo is published — the actual mechanism a "template" needs.
- justfile wrapping the cargo/nix commands for discoverability.
- .envrc (use flake) for direnv auto-activation.
- `just` added to the dev shell so the justfile is usable without a
  separate install.

Left out on purpose: workspace crate split, tracing/serde/tokio-heavy
example code, docker.nix, nightly coverage toolchain, and copier.yaml —
those make it an opinionated async-service starter rather than a blank
Rust template, and copier.yaml in the old repo was dead configuration
(no file actually referenced its Jinja variables).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018ALEXkc7pTro7tF1WcUuKb
This commit is contained in:
2026-08-11 00:50:51 +08:00
parent d61ba8aec2
commit c7303154cc
6 changed files with 100 additions and 2 deletions
+11
View File
@@ -0,0 +1,11 @@
# Automatically enter the Nix dev shell on `cd`. Requires direnv: https://direnv.net/
if ! has nix_direnv_version || ! nix_direnv_version 3.0.4; then
source_url "https://raw.githubusercontent.com/nix-community/nix-direnv/3.0.4/direnvrc" "sha256-DzlYZ33mWF/Gs8DDeyjr8mnVmQGx7ASYqA5WlxwvBG4="
fi
use flake
watch_file flake.nix
watch_file flake.lock
watch_file nix/*.nix
watch_file Cargo.toml
+6 -1
View File
@@ -50,6 +50,10 @@ Both paths are meant to converge on the same result — the Nix devShell and the
are built from one shared toolchain/build-args definition (see Architecture below), so what are built from one shared toolchain/build-args definition (see Architecture below), so what
compiles under `nix build` should also compile under plain `cargo build` inside `nix develop`. compiles under `nix build` should also compile under plain `cargo build` inside `nix develop`.
`justfile` wraps the commands above (`just build`, `just test`, `just ci`, `just nix-check`, ...;
run `just` with no args to list them) — available inside `nix develop`. `.envrc` (`use flake`) lets
direnv users skip typing `nix develop` entirely.
## IDE / LSP support ## IDE / LSP support
`rust-analyzer` is included in the fenix toolchain (`nix/rust.nix`), and `nix develop`'s `rust-analyzer` is included in the fenix toolchain (`nix/rust.nix`), and `nix develop`'s
@@ -74,7 +78,8 @@ install, so the LSP sees the same compiler version as the build.
treefmt-nix, wired into both `nix fmt` and the `formatting` check in `flake.nix`. treefmt-nix, wired into both `nix fmt` and the `formatting` check in `flake.nix`.
- **`flake.nix`** ties it together with `flake-parts`: it imports the treefmt module, evaluates - **`flake.nix`** ties it together with `flake-parts`: it imports the treefmt module, evaluates
`nix/rust.nix` per-system, and exposes `packages.default`, `checks`, `apps.default`, and `nix/rust.nix` per-system, and exposes `packages.default`, `checks`, `apps.default`, and
`devShells.default` from its outputs. `devShells.default` from its outputs. It also declares `flake.templates.default`, so once this
repo is published, `nix flake init -t <url>` scaffolds a new project straight from it.
- **`src/lib.rs`** holds the actual logic (currently just `greet`); `src/main.rs` is a thin `clap` - **`src/lib.rs`** holds the actual logic (currently just `greet`); `src/main.rs` is a thin `clap`
wrapper around it. Keep new functionality in the lib crate, not `main.rs`, so it stays reachable wrapper around it. Keep new functionality in the lib crate, not `main.rs`, so it stays reachable
from `tests/` and `benches/` (both depend on the `rust_template` lib crate by name, not on the from `tests/` and `benches/` (both depend on the `rust_template` lib crate by name, not on the
+6 -1
View File
@@ -6,7 +6,7 @@ way with plain `cargo` or with `nix`.
## Using this template ## Using this template
1. Copy/clone this repo. 1. Copy/clone this repo (or, once published, `nix flake init -t <this-repo-url>`).
2. Rename the placeholder crate name: 2. Rename the placeholder crate name:
```bash ```bash
./scripts/rename-project.sh my_project ./scripts/rename-project.sh my_project
@@ -34,4 +34,9 @@ nix flake check # clippy, fmt, doc, audit, tests — all in one go
nix fmt # format Rust, Nix, and TOML files nix fmt # format Rust, Nix, and TOML files
``` ```
If you have [direnv](https://direnv.net/) installed, `direnv allow` activates the dev shell
automatically on `cd` (see `.envrc`).
`just` (available inside `nix develop`) wraps the common commands above — run `just` to list them.
See `CLAUDE.md` for more detail on the project layout and how the pieces fit together. See `CLAUDE.md` for more detail on the project layout and how the pieces fit together.
+5
View File
@@ -76,5 +76,10 @@
devShells.default = import ./nix/devshell.nix { inherit pkgs lib rust; }; devShells.default = import ./nix/devshell.nix { inherit pkgs lib rust; };
}; };
flake.templates.default = {
path = ./.;
description = "Rust CLI + lib template with crane, fenix, and treefmt-nix";
};
}; };
} }
+71
View File
@@ -0,0 +1,71 @@
# justfile — task runner. See: https://just.systems/
# Available via `nix develop` (or install `just` yourself).
default:
@just --list
# --- cargo ---
build:
cargo build
build-release:
cargo build --release
run *args:
cargo run -- {{ args }}
test:
cargo test
bench:
cargo bench
clippy:
cargo clippy --all-targets -- --deny warnings
fmt:
nix fmt
fmt-check:
nix fmt -- --fail-on-change
audit:
cargo audit
doc:
cargo doc --no-deps
doc-open:
cargo doc --no-deps --open
# Everything nix flake check runs, but via cargo for a faster local loop
ci: fmt-check clippy test audit doc
clean:
cargo clean
rm -rf result result-*
# Background code checker (bacon)
watch:
bacon
# --- nix ---
nix-build:
nix build
nix-check:
nix flake check
nix-develop:
nix develop
nix-update:
nix flake update
# --- template ---
# Rename the "rust_template" placeholder to <name> (snake_case)
rename name:
./scripts/rename-project.sh {{ name }}
+1
View File
@@ -18,6 +18,7 @@ rust.craneLib.devShell {
cargo-expand cargo-expand
taplo taplo
bacon bacon
just
] ]
++ lib.optionals pkgs.stdenv.isLinux [ mold ] ++ lib.optionals pkgs.stdenv.isLinux [ mold ]
++ lib.optionals pkgs.stdenv.isDarwin [ ++ lib.optionals pkgs.stdenv.isDarwin [