53e498ca45c7ca9dd843c25e9114388300b1aee2
repo-lib
Simple Nix flake library for:
- a shared development shell (
mkDevShell) - an optional release command (
mkRelease) - a starter template (
template/)
Prerequisites
Use the template (new repo)
From your new project folder:
nix flake new myapp -t 'git+https://git.dgren.dev/eric/nix-flake-lib?ref=v2.0.1#default' --refresh
Use the library (existing repo)
Add this flake input:
inputs.devshell-lib.url = "git+https://git.dgren.dev/eric/nix-flake-lib?ref=v2.0.1";
inputs.devshell-lib.inputs.nixpkgs.follows = "nixpkgs";
Create your shell from mkDevShell:
env = devshell-lib.lib.mkDevShell {
inherit system;
src = ./.;
extraPackages = [ ];
preToolHook = "";
tools = [ ];
additionalHooks = { };
};
Expose it in devShells as default and run:
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.
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
nix fmt # format files
Optional: release command
If your flake defines:
packages.${system}.release = devshell-lib.lib.mkRelease { inherit system; };
Run releases with:
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).
Description
Languages
Go
60.9%
Nix
32.7%
Shell
6.4%