Skip to content

Latest commit

 

History

History
245 lines (188 loc) · 9.53 KB

File metadata and controls

245 lines (188 loc) · 9.53 KB

CLI Reference

All commands are subcommands of go2nix. Set GO2NIX_DEBUG=1 for verbose output.

Commands you run

generate

Generate a lockfile from one or more Go module directories.

go2nix generate [flags] [dir...]
Flag Default Description
-o go2nix.toml Output lockfile path
-j NumCPU Max parallel hash invocations

When no directory is given, defaults to .. Multiple directories produce a merged lockfile (monorepo support).

The generated lockfile is shared by both builder modes. Use buildGoApplication (default) or buildGoApplicationExperimental in Nix.

Examples:

go2nix generate .                       # write go2nix.toml in the current module
go2nix                                  # same — a completely bare invocation runs generate
go2nix generate -o lock.toml ./a ./b    # merged lockfile for two modules

generate reads each directory's go.mod (its require and replace lines, so tidy it first) and downloads every module to hash it: it needs go on PATH and access to your GOPROXY. An existing output file is used as a cache, so a re-run only downloads what changed. -o is relative to the current directory, not to dir. Only the bare go2nix defaults to generate; go2nix ./dir or go2nix -o x.toml is an unknown command, and there is no top-level --help (each subcommand has -h).

See Lockfile Format for the output schema.

check

Validate a lockfile against go.mod.

go2nix check [flags] [dir]
Flag Default Description
--lockfile go2nix.toml Path to lockfile for consistency check

Verifies that every go.mod requirement (filesystem replaces aside) has a path@version entry in the lockfile's [mod]. It does not recompute hashes, look at [replace], or complain about entries that are no longer needed. It prints nothing and exits 0 on success; on failure it exits 1 with check failed and the missing modules. Notes: flags go before dir (go2nix check --lockfile x.toml dir), only one directory is taken, the default --lockfile is relative to the current directory, and a lockfile that does not exist reads as an empty one, so every module is reported missing.

Commands the builders run

compile-package, link-binary and test-packages are what the default mode's derivations run; resolve is what the experimental mode's wrapper runs (and it calls compile-package from the derivations it registers). You won't normally run these; they are documented for debugging build failures. The manifests they read are JSON files the Nix side writes into the build directory.

compile-package

Compile a single Go package to an archive (.a file). Every per-package derivation runs it, in both modes: directly from the raw builder for pure-Go packages, through the compile-go-pkg.sh hook for cgo ones, and from the derivations go2nix resolve registers in experimental mode.

go2nix compile-package --manifest FILE --import-path PATH --src-dir DIR --output FILE [flags]
Flag Required Description
--manifest Yes Path to compile-manifest.json
--import-path Yes Go import path for the package
--src-dir Yes Directory containing source files
--output Yes Output .a archive path
--iface-output No Write export-data-only interface (.x) to this path; --output then receives the link object via -linkobj
--importcfg-output No Write importcfg entry for consumers to this path
--trim-path No Path prefix to trim (default: $NIX_BUILD_TOP)
--p No Override -p flag (default: import-path)
--go-version No Go language version for -lang (default: read from go.mod)
--module-path No Owning module's path; with --module-version, source paths are rewritten to <module>@<version>/... as go build -trimpath does
--module-version No Owning module's version (from the require line); empty for main-module packages, which rewrite to the import path

link-binary

Link Go application binaries. Reads a link manifest that declares all inputs (importcfg parts, local archives, ldflags, etc.), validates the lockfile, generates modinfo, compiles main packages, and invokes the linker. Used internally by the default mode's build phase.

go2nix link-binary --manifest FILE --output DIR
Flag Required Description
--manifest Yes Path to link-manifest.json
--output Yes Output directory (binaries written to <output>/bin/)

test-packages

Compile and run the tests of the local packages that are part of the build. Used internally by the default mode's check phase.

go2nix test-packages --manifest FILE
Flag Required Description
--manifest Yes Path to test-manifest.json

Discovers local packages with _test.go files, keeps those whose archive is in the manifest (the subPackages closure plus test-only helpers; the rest are skipped), compiles internal and external test archives, generates test mains, links test binaries, and runs them. See test-support.md for details on the test pipeline.

resolve

Build-time command for experimental mode (the nix/dynamic/ builder). Discovers the package graph, computes CA .drv paths in-process, registers them with the nix-daemon (falling back to nix derivation add if no daemon socket is reachable), and produces a .drv file as output. See Experimental Mode.

go2nix resolve [flags]
Flag Required Description
--src Yes Store path to Go source
--mod-root No Subdirectory within src containing go.mod
--lockfile Yes Path to go2nix.toml lockfile
--system Yes Nix system (e.g., x86_64-linux)
--go Yes Path to go binary
--nix Yes Path to nix binary
--pname Yes Output binary name
--output Yes $out path
--stdlib Yes Path to pre-compiled Go stdlib
--go2nix No Path to go2nix binary (defaults to self)
--bash No Path to bash binary
--coreutils No Path to a coreutils binary (e.g., coreutils/bin/mkdir)
--sub-packages No Comma-separated sub-packages
--tags No Comma-separated build tags
--ldflags No Linker flags
--cgo-enabled No Override CGO_ENABLED (0 or 1)
--gcflags No Extra flags for go tool compile
--pgo-profile No Store path to pprof CPU profile for PGO
--overrides No JSON-encoded packageOverrides
--cacert No Path to CA certificate bundle
--netrc-file No Path to .netrc for private modules
--nix-jobs No Max concurrent derivation registrations
--daemon-socket No nix-daemon Unix socket; default $NIX_DAEMON_SOCKET_PATH. When reachable, derivations are registered over the socket instead of via nix CLI subprocesses

This command is not intended for direct use — it is invoked by the experimental-mode Nix builder inside a recursive-nix build.

Inspection tools

Not called by anything. They show what the builders see: which files go would pick in a directory, which packages a module has, what build information a binary would embed, what a generated test main looks like.

list-files

List Go source files for a package directory, respecting build tags and constraints.

go2nix list-files [-tags=...] [-go-version=...] <package-dir>

Outputs JSON with categorized file lists (Go files, C files, assembly, etc.).

-go-version sets the target Go toolchain version (e.g. 1.25) used to evaluate //go:build go1.N constraints; defaults to go env GOVERSION.

list-packages

List all local packages in a Go module with their import dependencies.

go2nix list-packages [-tags=...] [-go-version=...] <module-root>

Outputs JSON with each package's import path and dependencies.

build-modinfo

Generate a modinfo linker directive for embedding debug/buildinfo metadata into the final binary. This is a standalone utility; the default mode's link-binary command generates modinfo internally.

go2nix build-modinfo [flags] <module-root>
Flag Required Description
--lockfile Yes Path to go2nix.toml lockfile
--go No Path to go binary (default: from PATH)
--main-path No Import path of the main package (default: the module path)
--main-dir No Directory of the main package, read for //go:debug directives (default: MODULE_ROOT)

Outputs a modinfo directive for the linker's importcfg (embedding debug/buildinfo metadata), and optionally a godebug line with the default GODEBUG value parsed from the module's go.mod (used for -X=runtime.godebugDefault=...).

generate-test-main

Generate a _testmain.go file that registers test, benchmark, fuzz, and example functions. Standalone: the test runner generates its mains in-process with the same code, nothing calls this subcommand.

go2nix generate-test-main [flags]
Flag Required Description
--import-path Yes Import path of the package under test
--module-path No Module path of the main module
--test-files No Comma-separated absolute paths to internal _test.go files
--xtest-files No Comma-separated absolute paths to external _test.go files
--output No Output file path (default: stdout)