Description
What version of Go are you using (go version
)?
go version go1.11 linux/amd64
Does this issue reproduce with the latest release?
yes
What did you do?
I'm attempting to populate a Docker cache layer with compiled dependencies based on the contents of go.mod
. The general recommendation with Docker is to use go mod download
however this only provides caching of sources.
go build all
can be used to compile these sources but instead of relying on go.mod
contents, it requires my application source to be present to determine which deps to build. This causes a cache invalidation on every code change and renders the step useless.
Here's a Dockerfile demonstrating my issue:
FROM golang:1.11-alpine
RUN apk add git
ENV CGO_ENABLED=0 GOOS=linux
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
# this fails
RUN go build all
# => go: warning: "all" matched no packages
COPY . .
# this now works but isn't needed
RUN go build all
# compile app along with any unbuilt deps
RUN go build
From package lists and patterns:
When using modules, "all" expands to all packages in the main module and their dependencies, including dependencies needed by tests of any of those.
where the main module is defined by the contents of go.mod
(if I'm understanding this correctly).
Since "the main module's go.mod file defines the precise set of packages available for use by the go command", I would expect go build all
to rely on go.mod
and build any packages listed within.
Other actions which support "all" have this issue but some have flags which resolve it (go list -m all
).