Sign inSign up

boyvinall/go-make

By boyvinall

•Updated over 6 years ago

Tools to build golang projects

Image
1

6.4K

boyvinall/go-make repository overview

Makefile snippets (aka "makelets" :smile:) that I use for building golang projects. Everyone likes their own, I like these :bowtie: Just wanted a public place to put them so I don't end up with scattered copies everywhere .. so this repo is kind of intended just for my benefit, but maybe you'll find a use too. If you'd like something else included, then fork away and send a PR if you like.

There are a few different example projects which demonstrate usage. I didn't include them in here for two reasons: (1) so that you can easily see what's needed in your own projects, (2) to keep this repo slightly simpler. The examples:

⁠Scaffolding generation

Along with the makelets, this repo also contains a simple CLI tool⁠ to generate various scaffolding. Further info on the CLI tool is available there.

⁠Features

⁠Make targets

It's definitely recommended that you use autocomplete⁠ for make.

These targets are supported by batteries.mk⁠:

Target(s)Description
installDoes a go install
vendorUses glide to install versioned packages to your vendor directory
lint-fast, lint, lint-fullUses gometalinter to scan for possible nasties.
The different targets just enable different options, either --fast,
default, or --enable-all
test-short, testinvokes go test on all local packages (it skips the vendored ones).
test-short will pass the --short option in case you have some tests
that take a long time to run (e.g. testing timeouts etc)
coverage-short, coverageuses gocov to invoke go test on all your local packages, generating code
coverage info. Also builds an HTML file that shows which source lines
are not covered by your tests
clean::it's a double-colon⁠ make rule so that it can be extended by your own makefile
clobber::gets things really really clean, it will invoke the clean target first

and these are defined elsewhere, included above:

Target(s)Description
gopathAllows you to run eval $(make gopath) from your bash shell, sets up $GOPATH in your environment and adds $GOPATH/bin to your $PATH

⁠Macros etc

VariableDescription
$(call PROMPT, ...)Use in a make rule, just prints a little banner heading with some text
STRIP_DEBUGDefine options to pass to go build via -ldflags to strip debug for smaller binaries

⁠Supported Tools

Most of the tool support is quite simple, in many cases not much more than something to install the tool and a make variable to refer to the binary. Others are more fully featured. Brief info follows below.

⁠glide⁠

There are a plethora of package managers / vendoring tools for go at the moment. I currently use glide⁠.

Defined variables:

VariableDescription
$(GLIDE)Refers to the glide executable. You can depend on this to get glide installed
$(GLIDE_OPT_INSTALL)options to be passed to glide install (used to install package dependencies)

⁠gometalinter⁠

Superb wrapper to simplify running a whole bunch of linters on your code. See gometalinter⁠

This makelet defines a few settings which you can override before you include gomake.

Defined variables:

VariableDescription
$(GOMETALINTER)Refers to the gometalinter executable. You can depend on this to get gometalinter installed
$(GOMETALINTER_OPT)Sets up some default options for gometalinter (including the settings just below)
$(GOMETALINTER_LINELENGTH)Sets the text line length used during linting
$(GOMETALINTER_DEADLINE)Sets the a linting time deadline (some linters can take quite a while...)
$(GOMETALINTER_CYCLO)Sets the cyclomatic complexity⁠ used during linting

⁠goconvey⁠

The goconvey⁠ makelet needs no other integration in your main makefile. Just run as follows (from your repo):

$ make goconvey

And it should install itself and fire up a webpage on http://127.0.0.1:8080⁠. All your go test tests will be run on any code change, and you can get browser notifications when a test fails.

⁠gocov⁠

gocov⁠ provides a nice wrapper around go test by simplifying the process of getting code coverage on a per-package basis. The gocov-html⁠ generates a nice HTML file where you can easily see which source lines are not tested.

⁠rice⁠

Useful to embed directories of static files into binaries. See go.rice⁠

VariableDescription
$(RICE)Refers to the rice executable. You can depend on this to get it installed

⁠go-bindata⁠

Sometimes, or for gopherjs, you may want to include assets as part of the compilation process instead of using rice (above). In those cases, go-bindata⁠ can be very useful.

VariableDescription
$(GO_BINDATA)Refers to the go-bindata executable. You can depend on this to get it installed

⁠goa⁠

See github.com/goadesign/goa⁠

VariableDescription
$(GOAGEN)Refers to the goagen executable. You can depend on this to get it installed

There are make targets defined for each goa generate command, see table below. This can be useful as part of a make process to ensure things are always up-to-date.

Target(s)Description
goagen-appRuns the goagen "app" command
goagen-bootstrapRuns the goagen "bootstrap" command
goagen-clientRuns the goagen "client" command
goagen-controllerRuns the goagen "controller" command
goagen-genRuns the goagen "gen" command
goagen-jsRuns the goagen "js" command
goagen-mainRuns the goagen "main" command
goagen-schemaRuns the goagen "schema" command
goagen-swaggerRuns the goagen "swagger" command

⁠gopherjs⁠

golang in the browser #FTW. See gopherjs⁠

VariableDescription
$(GOPHERJS)Refers to the gopherjs executable. You can depend on this to get gopherjs installed
$(TEMPLE)Refers to the temple executable (used to enable go-templates for client-side markup generation). You can depend on this to get temple installed

⁠gravitational/version⁠

Allows you to print the git tag/hash of the repo when your app runs. See github.com/gravitational/version⁠ or the godocs⁠ for more info.

Use this define something like:

$(BIN): | $(CMD_LINKFLAGS)
    $(GO) build -ldflags='$(call VERSION_LDFLAGS_VENDOR,github.com/example/myrepo)'

NB, this assumes you've vendored this package. If not, then omit the _VENDOR in the line above.

⁠docker⁠

Part of a separate repo, so that you can use the docker makelets in non-go projects. See github.com/go-make/docker⁠

⁠protobuf/grpc⁠

Tag summary

Content type

Image

Digest

Size

524.3 MB

Last updated

over 6 years ago

docker pull boyvinall/go-make