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:
@@ -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
|
||||||
@@ -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,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.
|
||||||
|
|||||||
@@ -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";
|
||||||
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 }}
|
||||||
@@ -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 [
|
||||||
|
|||||||
Reference in New Issue
Block a user