First: go version go1.16 linux/amd64 In one of my side-projects, I build a container image. It turns out to be useful to people, but I got a request to put the license files for all code used in the binary into the container. Lawyers, what can you do?
So these people sent me a PR to gather the licenses with `go install github.com/google/go-licenses` in the `make container` rule. Here's the friction. 1) Their PR includes dozens of new lines in go.sum, which makes me grumpy. I set out to see if I can do better. 2) When I run that command on my workstation I get: ``` $ go install github.com/google/go-licenses cannot find package "." in: /home/thockin/src/go/src/k8s.io/git-sync/vendor/github.com/google/go-licenses ``` I don't know what to make of that message. It's not in vendor/ yet - I want to put it there (I think?). So I am left wondering - what is the normal flow for "I want to use this Go tool in my build" ? I tried `-mod=mod`: ``` $ (unset GOPATH; go install -mod=mod github.com/google/go-licenses) go: writing go.mod cache: mkdir /home/thockin/go: not a directory go: writing go.mod cache: mkdir /home/thockin/go: not a directory go: writing go.mod cache: mkdir /home/thockin/go: not a directory go: writing go.mod cache: mkdir /home/thockin/go: not a directory go: writing go.mod cache: mkdir /home/thockin/go: not a directory go: writing go.mod cache: mkdir /home/thockin/go: not a directory go: writing go.mod cache: mkdir /home/thockin/go: not a directory go: writing go.mod cache: mkdir /home/thockin/go: not a directory go: writing go.mod cache: mkdir /home/thockin/go: not a directory go: writing go.mod cache: mkdir /home/thockin/go: not a directory go: writing go.mod cache: mkdir /home/thockin/go: not a directory go: writing go.mod cache: mkdir /home/thockin/go: not a directory go: finding module for package github.com/google/go-licenses go: downloading github.com/google/go-licenses v0.0.0-20201026145851-73411c8fa237 mkdir /home/thockin/go: not a directory ``` I keep hearing that GOPATH is dead (and frankly good riddance) but this tries to write to GOPATH or ~/go (which is also annoying). I don't want this project's build spilling over into my homedir. I tried `go get` but it's the same. ``` $ (unset GOPATH; go get github.com/google/go-licenses) go: writing go.mod cache: mkdir /home/thockin/go: not a directory go: writing go.mod cache: mkdir /home/thockin/go: not a directory go: writing go.mod cache: mkdir /home/thockin/go: not a directory go: writing go.mod cache: mkdir /home/thockin/go: not a directory go: writing go.mod cache: mkdir /home/thockin/go: not a directory go: writing go.mod cache: mkdir /home/thockin/go: not a directory go: writing go.mod cache: mkdir /home/thockin/go: not a directory go: writing go.mod cache: mkdir /home/thockin/go: not a directory go: writing go.mod cache: mkdir /home/thockin/go: not a directory go: writing go.mod cache: mkdir /home/thockin/go: not a directory go: writing go.mod cache: mkdir /home/thockin/go: not a directory go: writing go.mod cache: mkdir /home/thockin/go: not a directory go: downloading github.com/google/go-licenses v0.0.0-20201026145851-73411c8fa237 go get github.com/google/go-licenses: mkdir /home/thockin/go: not a directory ``` What do I *want*? I want to download a tool repo, build it, drop the binary into ./bin/tools (or something) and then either vendor it or have no artifacts. Since GOPATH seems to be a requirement, I thought maybe I can fake it: ``` $ (export GOPATH="`pwd`/.gopath"; export GOBIN=`pwd`/bin/tools; mkdir -p "$GOBIN"; go get github.com/google/go-licenses) go: downloading github.com/google/go-licenses v0.0.0-20201026145851-73411c8fa237 go: downloading github.com/otiai10/copy v1.2.0 go: downloading github.com/spf13/cobra v0.0.5 go: downloading github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b go: downloading github.com/google/licenseclassifier v0.0.0-20190926221455-842c0d70d702 go: downloading golang.org/x/tools v0.0.0-20191118222007-07fc4c7f2b98 go: downloading gopkg.in/src-d/go-git.v4 v4.13.1 go: downloading github.com/spf13/pflag v1.0.5 go: downloading github.com/inconshreveable/mousetrap v1.0.0 go: downloading github.com/sergi/go-diff v1.0.0 go: downloading gopkg.in/src-d/go-billy.v4 v4.3.2 go: downloading golang.org/x/crypto v0.0.0-20191117063200-497ca9f6d64f go: downloading golang.org/x/sys v0.0.0-20191119060738-e882bf8e40c2 go: downloading github.com/emirpasic/gods v1.12.0 go: downloading github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 go: downloading github.com/src-d/gcfg v1.4.0 go: downloading github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd go: downloading github.com/mitchellh/go-homedir v1.1.0 go: downloading github.com/xanzy/ssh-agent v0.2.1 go: downloading golang.org/x/net v0.0.0-20191119073136-fc4aabc6c914 go: downloading gopkg.in/warnings.v0 v0.1.2 go get: added github.com/google/go-licenses v0.0.0-20201026145851-73411c8fa237 ``` This does actually build my binary (and leaves me one more thing to `make clean`), but it also writes to go.mod and go.sum. I thought I'd complete the task and vendor the code. `go mod vendor` adds a line to vendor/modules.txt: ``` # github.com/google/go-licenses v0.0.0-20201026145851-73411c8fa237 ``` ...but doesn't actually vendor the code. OK. What if I just clean up? `go mod tidy`. This leaves that vendor/modules.txt change but removes almost all of the other changes to go.sum. Curiously, it leaves some: ``` $ git diff diff --git a/go.mod b/go.mod index ced314c..cfe7bca 100644 --- a/go.mod +++ b/go.mod @@ -5,6 +5,7 @@ require ( github.com/go-logr/logr v0.1.0 // indirect github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b // indirect github.com/prometheus/client_golang v0.9.2 + golang.org/x/sync v0.0.0-20190423024810-112230192c58 // indirect ) go 1.15 diff --git a/go.sum b/go.sum index b9f0527..4e159c8 100644 --- a/go.sum +++ b/go.sum @@ -19,5 +19,6 @@ github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7q github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a h1:9a8MnZMP0X2nLJdBg+pBmGgkJlSaKC2KaQmTCk1XDtE= github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f h1:Bl/8QSvNqXvPGPGXa2z5xUTmV7VDcZyvRZ+QQXkXTZQ= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= ``` If I reset the whole repo and run `go mod tidy` it does not make this change. Googling around I found a suggestion to use a different modfile. That sounds like a hack, but I'll try it. I made a new, nearly-empty `go.tools.mod`: ``` $ (export GOPATH="`pwd`/.gopath"; export GOBIN=`pwd`/bin/tools; mkdir -p "$GOBIN"; go get -modfile=go.tools.mod github.com/google/go-licenses) ``` This works and wrote to go.tools.mod a created a new go.tools.sum. I still can't figure how to vendor the tool. I guess I can just .gitignore those, but this is starting to feel like I made a wrong turn at Albuquerque. There has to be a "normal" path here, right? I feel like I shouldn't have to fight so hard to make a more self-contained build. Can someone clue me in? Tim -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/CAO_Rewb_5vBW4fuEa6i-XLLRiHqgEibxXTce3hHmOHfgAsRpfQ%40mail.gmail.com.