The forgotten go tool that executes and caches binaries included in go.mod files. This makes it easy to version cli tools in your projects such as golangci-lint and ginkgo that are versioned locked to what you specify in go.mod. Binaries are cached by go version and package version.
Example
# Run a linter gomodrun golangci-lint run # Convert a JSON object to a Go struct, properly passing in stdin. echo example.json | gomodrun gojson > example.go # Specifiy alternative root directory containing a go.mod and tools file. gomodrun -r ./alternative-tools-dir golangci-lint run # Clean your .gomodrun folder of unused binaries. gomodrun --tidy
Install
Source
curl -L "https://github.com/dustinblackman/gomodrun/archive/refs/heads/master.tar.gz" | tar zxvf - -C /tmp cd /tmp/gomodrun-master/cmd/gomodrun go install .
Usage
gomodrun works by using a tools.go (or any other name) file that sits in the root of your project that contains all the CLI dependencies you want bundled in to your go.mod. Note the // +build tools at the top of the file is required, and allows you to name your tools file anything you like.
tools.go
// +build tools package myapp import ( _ "github.com/golangci/golangci-lint/cmd/golangci-lint" _ "github.com/onsi/ginkgo/ginkgo" )
Run go build tools.go to add the dependencies to your go.mod. The build is expected to fail.
CLI
You can run your tools by prefixing gomodrun. A binary will be built and cached in .gomodrun in the root of your project, allowing all runs after the first to be nice and fast.
gomodrun golangci-lint run
Programmatically
You can also use gomodrun as a library.
package main import ( "os" "github.com/dustinblackman/gomodrun" ) func main() { exitCode, err := gomodrun.Run("golangci-lint", []string{"run"}, &gomodrun.Options{ Stdin: os.Stdin, Stdout: os.Stdout, Stderr: os.Stderr, Env: os.Environ(), PkgRoot: "", }) }
License
MIT
