Package ron provides a command line interface to common build tasks.
$ ron
Usage: ron <command>
Available commands are:
b, bash_completion Print the bash completion script.
burgundy Stay classy.
cmd Run a command with optional restart and watch for changes to restart.
hs, httpstat HTTP trace timings
replace Find and replace in text.
t, target Execute a configured target.
template Render a Go template using environment variables.
upgrade Upgrade the ron binary.
version Print the version.
http://godoc.org/github.com/upsight/ron
$ go get -u github.com/upsight/ron/cmd/...
or download from releases
LATEST_URL=https://github.com/upsight/ron/releases/download/v1.1.3/ron-linux-v1.1.3 ron upgrade
$ ron t go:test
To extend or customize ron, you can either fork the repo, or vendor it and overwrite the target/default.yaml file and add custom commands.
The vendoring approach may look something like this:
-
Add vendor/github.com/upsight/ron to your project with whatever package manager you choose (dep, glide, etc.)
-
Create a new folder for your custom commands ./commands/commandname/commandname.go
package commandname
import (
"fmt"
"io"
)
// Command ...
type Command struct {
Name string
W io.Writer
WErr io.Writer
AppName string
AppVersion string
GitCommit string
}
// Run ...
func (c *Command) Run(args []string) (int, error) {
fmt.Fprintln(c.W, c.AppName, c.AppVersion, c.GitCommit)
return 0, nil
}
// Key returns the commands name for sorting.
func (c *Command) Key() string {
return c.Name
}
// Aliases are the aliases and name for the command. For instance
// a command can have a long form and short form.
func (c *Command) Aliases() map[string]struct{} {
return map[string]struct{}{
"someothername": struct{}{},
}
}
// Description is what is printed in Usage.
func (c *Command) Description() string {
return "My command."
}
- Create a custom cmd/ron/main.go and add all of your commands.
package main
import (
"log"
"os"
"mygitrepo.com/ron/commands/commandname"
"github.com/upsight/ron"
"github.com/upsight/ron/color"
)
func main() {
c := ron.NewDefaultCommander(os.Stdout, os.Stderr)
c.Add(&commandname.Command{AppName: ron.AppName, Name: "project", W: os.Stdout, WErr: os.Stderr})
status, err := ron.Run(c, os.Args[1:])
if err != nil {
hostname, _ := os.Hostname()
log.Println(hostname, color.Red(err.Error()))
}
os.Exit(status)
}
- Optionally overwrite ./vendor/github.com/upsight/ron/target/default.yaml to have custom targets.
This can be done in a target or manually.
touch default.yaml
cp default.yaml vendor/$RONREPO/target/default.yaml
- Create a ./ron.yaml file with instructions on how to put it all together.
{{$path := "export PATH=$GOPATH/bin:$PATH"}}
envs:
- APP: ron
- ARCH: amd64
- PACKAGE_VERSION: +echo `git describe --tags`.`git rev-parse HEAD`
- REPO: myrepo.com/ron
- RONREPO: github.com/upsight/ron
- UNAME: +uname | tr '[:upper:]' '[:lower:]'
- VERSION: 1.4.0
- TAG: v${VERSION}
targets:
prep:
description: Compile the default yaml asset to a go file.
cmd: |
go install ./vendor/github.com/jteeuwen/go-bindata/go-bindata || go get -u github.com/jteeuwen/go-bindata/...
cp default.yaml vendor/$RONREPO/target/default.yaml
cd vendor/$RONREPO/target
go-bindata -o default.go -pkg=target default.yaml
build:
description: Compile a binary to ./bin/${UNAME}_${ARCH}
before:
- go:prep
cmd: |
{{$path}}
mkdir -p bin/${UNAME}_${ARCH}
GOARCH=$ARCH GOOS=$UNAME go build -o bin/${UNAME}_${ARCH}/${APP}-${UNAME}-${TAG} -ldflags "-X $REPO/vendor/$RONREPO.GitCommit=$PACKAGE_VERSION -X $REPO/vendor/$RONREPO.AppVersion=$TAG -X $REPO/vendor/$RONREPO.AppName=$APP" cmd/ron/*.go
- Run the build
ron t ron:build && ls bin/