Upgrade to Pro — share decks privately, control downloads, hide ads and more …

How to manage tool dependencies in Go

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for izumin5210 izumin5210
December 18, 2018

How to manage tool dependencies in Go

talked on golang.tokyo #20
https://golangtokyo.connpass.com/event/111077/

talked about izumin5210/gex https://github.com/izumin5210/gex

Avatar for izumin5210

izumin5210

December 18, 2018
Tweet

More Decks by izumin5210

Other Decks in Programming

Transcript

  1. Why should we manage versions of tools? ⬇ Behaviors of

    tools may change when developers install them via `go get` (e.g. an output file format of code generator)
  2. [email protected] [email protected] [email protected] mockgen@bd3c8e8 [email protected] [email protected] mockgen@ddf6e33 Why should we

    manage versions of tools? ⬇ Behaviors of tools may change when developers install them via `go get` (e.g. an output file format of code generator)
  3. Mock implementation that I wanna create Mocks that updated unexpectedly

    Because I use [email protected] but they are generated by [email protected] If you do not manage tool dependencies ...
  4. How about existing package managers? (e.g. dep ,go mod) `go

    build` is the out of scope of their responsibility dep document says* if you need the tool to be installed you still run the following (manually or from a `Makefile`) after each `dep ensure`
 ```
 cd vendor/pkg/to/install
 go install .
 ``` * https://golang.github.io/dep/docs/Gopkg.toml.html#required
  5. How about existing package managers? (e.g. dep ,go mod) #

    Makefile DEP_COMMANDS := \ vendor/github.com/golang/mock/mockgen .PHONY: dep dep: Gopkg.toml Gopkg.lock @dep ensure -v -vendor-only pkgs="$(DEP_COMMANDS)"; \ for pkg in $$pkgs; do \ cd $$pkg; \ GOBIN="$(shell pwd)/bin" go install .; \ cd -; \ done # Gopkg.toml required = [ "github.com/golang/mock/mockgen", ]
  6. cmd/go: clarify best practice for tool dependencies #25922 · golang/go

    // tools.go // +build tools package tools import ( _ "golang.org/x/tools/cmd/stringer" ) // go.mod module example.com/hello require golang.org/x/tools v0.0.0-20180813205110-a434f64ace81 // indirect go get export GOBIN=$(pwd)/bin go install golang.org/x/tools/cmd/stringer
  7. cmd/go: clarify best practice for tool dependencies #25922 · golang/go

    Other 3rd-party tools (e.g. virtualgo, retool, ...) need to
 introduce new management mechanisms "tools.go" method can use existing dependency management mechanisms (e.g. dep, go mod)
  8. cmd/go: clarify best practice for tool dependencies #25922 · golang/go

    // tools.go // +build tools package tools import ( _ "golang.org/x/tools/cmd/stringer" ) // go.mod module example.com/hello require golang.org/x/tools v0.0.0-20180813205110-a434f64ace81 // indirect go get export GOBIN=$(pwd)/bin go install golang.org/x/tools/cmd/stringer Best practice?
  9. cmd/go: clarify best practice for tool dependencies #25922 · golang/go

    // tools.go // +build tools package tools import ( _ "golang.org/x/tools/cmd/stringer" ) // go.mod module example.com/hello require golang.org/x/tools v0.0.0-20180813205110-a434f64ace81 // indirect go get export GOBIN=$(pwd)/bin go install golang.org/x/tools/cmd/stringer We want to also automate this step!
  10. gex: manage tools with `tools.go` github.com/izumin5210/gex $ gex --add github.com/golang/mock/mockgen

    $ cat tools.go // Code generated by github.com/izumin5210/gex. DO NOT EDIT. // +build tools package tools // tool dependencies import ( _ "github.com/golang/mock/mockgen" ) $ cat go.mod | grep mock github.com/golang/mock v1.1.1 // indirect $ gex mockgen # prints mockgen's help text...
  11. gex: manage tools with `tools.go` github.com/izumin5210/gex $ gex --add github.com/golang/mock/mockgen

    $ cat tools.go // Code generated by github.com/izumin5210/gex. DO NOT EDIT. // +build tools package tools // tool dependencies import ( _ "github.com/golang/mock/mockgen" ) $ cat go.mod | grep mock github.com/golang/mock v1.1.1 // indirect $ gex mockgen # prints mockgen's help text... Install mockgen via gex - gex manages dependencies version using `dep` or `go mod` - So `gex --add ...` runs `go get ...` or `dep ensure -add ...` internally - Build mockgen and output to `$PWD/bin`
  12. gex: manage tools with `tools.go` github.com/izumin5210/gex $ gex --add github.com/golang/mock/mockgen

    $ cat tools.go // Code generated by github.com/izumin5210/gex. DO NOT EDIT. // +build tools package tools // tool dependencies import ( _ "github.com/golang/mock/mockgen" ) $ cat go.mod | grep mock github.com/golang/mock v1.1.1 // indirect $ gex mockgen # prints mockgen's help text... `tools.go` will generate by `gex`
  13. gex: manage tools with `tools.go` github.com/izumin5210/gex $ gex --add github.com/golang/mock/mockgen

    $ cat tools.go // Code generated by github.com/izumin5210/gex. DO NOT EDIT. // +build tools package tools // tool dependencies import ( _ "github.com/golang/mock/mockgen" ) $ cat go.mod | grep mock github.com/golang/mock v1.1.1 // indirect $ gex mockgen # prints mockgen's help text... `go.mod` will modify because `gex` run `go get`
  14. gex: manage tools with `tools.go` github.com/izumin5210/gex $ gex --add github.com/golang/mock/mockgen

    $ cat tools.go // Code generated by github.com/izumin5210/gex. DO NOT EDIT. // +build tools package tools // tool dependencies import ( _ "github.com/golang/mock/mockgen" ) $ cat go.mod | grep mock github.com/golang/mock v1.1.1 // indirect $ gex mockgen # prints mockgen's help text... Run versioned mockgen - Execute `$PWD/bin/mockgen` - If `$PWD/bin/mockgen` does not exist, run `go build -o mockgen ...` automatically
  15. gex: manage tools with `tools.go` github.com/izumin5210/gex Does not introduce new

    mechanism to manage tool deps. - `gex` is very thin wrapper command of `dep` or `go mod` - For example, if `go mod` was to support to manage tools officially,
 we would be able to move from `gex` easily Only 2 commands that you use: `--add` and `--build` (I believe) tools management mechanism will be introduced
 into `golang/go` officially - When the time coms, we graduate from`gex`
  16. How to manage tool dependencies golang.tokyo #20 - @izumi5210 Let's

    manage tools with `gex` efficiently, and happy hacking with Go!