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.
# 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
homebrew (OSX / Linux):
brew install dustinblackman/tap/gomodrun
snapcraft (Linux):
$ sudo snap install gomodrun
scoop (Windows):
$ scoop bucket add dustinblackman https://github.com/dustinblackman/scoop-bucket.git
$ scoop install gomodrun
deb/rpm (Linux):
Download the .deb
or .rpm
from the releases page and
install with dpkg -i
and rpm -i
respectively.
manually:
Download the pre-compiled binaries from the releases page and copy to the desired location.
go/master branch:
go get -u github.com/dustinblackman/gomodrun/cmd/gomodrun
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.
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
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: "",
})
}
MIT