Awesome
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