Add nix-flake build option
closedCurrently, the pgit CLI builds using make. Users should have the option to build as part of a Nix using flakes. Create a flake.nix appropriate for building pgit from source using Go modules.
Currently, the pgit CLI builds using make. Users should have the option to build as part of a Nix using flakes. Create a flake.nix appropriate for building pgit from source using Go modules.
3 Comments
Add nix-flake build option - Implementation Plan
Goal: Create a flake.nix that enables building pgit from source using Go modules within the Nix ecosystem.
Architecture: The flake will provide a default package that builds the pgit CLI binary using buildGoModule, leveraging the existing go.mod and go.sum files. It will also include a devShell with Go and git for development.
Tech Stack: Nix flakes, nixpkgs, buildGoModule
Task 1: Create flake.nix
Files: - Create: flake.nix
Step 1: Create the flake.nix file
Create a flake that: - Uses nixpkgs as the primary input - Provides a default package that builds pgit using buildGoModule - Includes a devShell with Go and git - Uses go.mod/go.sum for dependency management
Step 2: Commit the initial flake.nix
Run: jj commit -m ‘feat: add initial flake.nix for nix builds’
Task 2: Update vendorHash and verify build
Files: - Modify: flake.nix
Step 1: Build the flake to get the expected vendor hash
Run: nix build
Expected: Build fails with error showing expected vendor hash
Step 2: Update vendorHash in flake.nix
Replace pkgs.lib.fakeSha256 with the actual hash from the error message.
Step 3: Rebuild to verify
Run: nix build
Expected: Build succeeds, creating ./result symlink
Step 4: Test the binary
Run: ./result/bin/pgit –help
Expected: Help output showing pgit CLI options
Step 5: Commit the updated hash
Run: jj commit -m ‘fix: update vendorHash in flake.nix’
Task 3: Add flake.lock and verify devShell
Files: - Create: flake.lock
Step 1: Generate flake.lock
Run: nix flake lock
Expected: Creates flake.lock file pinning all inputs
Step 2: Test the devShell
Run: nix develop –command go version
Expected: Shows Go version
Step 3: Verify go build works in devShell
Run: nix develop –command make build
Expected: Successfully builds pgit binary
Step 4: Commit the lock file
Run: jj commit -m ‘chore: add flake.lock for reproducible builds’
Task 4: Update documentation
Files: - Modify: README.md
Step 1: Add Nix build instructions to README
Add sections for: - Building with flakes (nix build) - Development shell (nix develop)
Step 2: Commit documentation update
Run: jj commit -m ‘docs: add nix build instructions to README’
Task 5: Add .envrc for direnv support (optional but recommended)
Files: - Create: .envrc
Step 1: Create .envrc file
Contents: use flake
Step 2: Add to .gitignore if not already
Ensure .direnv/ is in .gitignore
Step 3: Commit
Run: jj commit -m ‘chore: add direnv support with .envrc’
Verification Summary
After completing all tasks, verify:
Notes
Implementation complete!
Summary of changes: - Created flake.nix with buildGoModule for building pgit - Added vendorHash (sha256-95H+k3LHaB6WjnLpwjviCopwfO9MKbyiVKB5HWyNZgE=) - Added flake.lock for reproducible builds - Added devShell with Go, git, gopls, golangci-lint - Updated README.md with Nix build instructions - Added .envrc for direnv support - Added .direnv/ to .gitignore
Commits: - feat: add initial flake.nix for nix builds - fix: update vendorHash in flake.nix - chore: add flake.lock for reproducible builds - docs: add nix build instructions to README - chore: add direnv support with .envrc
Verification: - nix build succeeds - ./result/bin/pgit –help works - nix develop –command go version shows Go 1.26.1 - nix develop –command make build works
Additional changes: Added Makefile targets for automatic vendorHash updates
New Makefile targets: - update-vendor-hash: Depends on go.mod/go.sum, automatically updates vendorHash in flake.nix when dependencies change - update-flake-lock: Updates flake.lock when flake.nix inputs change - update-flake: Runs both update-vendor-hash and update-flake-lock
Usage: - Run ‘make update-vendor-hash’ after modifying go.mod/go.sum - The target detects hash mismatches and automatically updates flake.nix - Run ‘make update-flake’ to update both vendorHash and flake.lock
Also updated .gitignore to exclude: - update-vendor-hash (marker file) - update-flake-lock (marker file) - result (Nix build output symlink)