Files
nix-flake-lib/README.md
2026-03-07 06:54:41 +01:00

101 lines
2.2 KiB
Markdown

# repo-lib
Simple Nix flake library for:
- a shared development shell (`mkDevShell`)
- an optional release command (`mkRelease`)
- a starter template (`template/`)
## Prerequisites
- [Nix](https://nixos.org/download/) with flakes enabled
- [`direnv`](https://direnv.net/) (recommended)
## Use the template (new repo)
From your new project folder:
```bash
nix flake new myapp -t 'git+https://git.dgren.dev/eric/nix-flake-lib?ref=v2.1.0#default' --refresh
```
## Use the library (existing repo)
Add this flake input:
```nix
inputs.devshell-lib.url = "git+https://git.dgren.dev/eric/nix-flake-lib?ref=v2.1.0";
inputs.devshell-lib.inputs.nixpkgs.follows = "nixpkgs";
```
Create your shell from `mkDevShell`:
```nix
env = devshell-lib.lib.mkDevShell {
inherit system;
src = ./.;
extraPackages = [ ];
preToolHook = "";
tools = [ ];
additionalHooks = { };
};
```
Expose it in `devShells` as `default` and run:
```bash
nix develop
```
Use `preToolHook` when a tool needs bootstrap work before the shell prints tool versions. This is useful for tools you install outside `nixpkgs`, as long as the hook is idempotent.
```nix
env = devshell-lib.lib.mkDevShell {
inherit system;
src = ./.;
# assumes `go` is already available in PATH, for example via `extraPackages`
preToolHook = ''
export GOBIN="$PWD/.tools/bin"
export PATH="$GOBIN:$PATH"
if ! command -v golangci-lint >/dev/null 2>&1; then
go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest
fi
'';
tools = [
{ name = "golangci-lint"; bin = "golangci-lint"; versionCmd = "version"; color = "YELLOW"; }
];
};
```
## Common commands
```bash
nix fmt # format files
```
## Optional: release command
If your flake defines:
```nix
packages.${system}.release = devshell-lib.lib.mkRelease { inherit system; };
```
Run releases with:
```bash
release
release patch
release beta
release minor beta
release stable
release set 1.2.3
```
The release script uses `./VERSION` as the source of truth and creates tags like `v1.2.3`.
When switching from stable to a prerelease channel without an explicit bump (for example, `release beta`), it applies a patch bump automatically (for example, `1.0.0` -> `1.0.1-beta.1`).