我知道Golang requirements.txt equivalent,但是问题的背景却大不相同。
我正在尝试优化docker容器内golang程序的构建。我的dockerfile看起来像这样:
FROM golang:1.12.5 as builder
WORKDIR $GOPATH/src/test-ldap/
COPY main.go .
RUN go get -d -v ./...
...
我的main.go
看起来像
package main
import (
"log"
"fmt"
"gopkg.in/ldap.v3"
)
func main() {
...
当然,每次我更改源代码时,docker层
COPY main.go .
已更改,因此go get
命令需要重新运行,即使import
块未更改,也无法从Docker构建缓存中重新使用。
现在我当然可以输入类似的内容
RUN go get -d -v log fmt gopkg.in/ldap.v3
并将其放在COPY
语句之前,但这违反了所谓的单一真相原理。如果我想添加额外的导入,那么我将不得不在代码库的两个不同位置更改同一件事。
如何将导入要求存储在单独的文件中?在go开发中实现此目的的惯用方式是什么?
答案 0 :(得分:2)
使用Go modules。然后,像处理go.mod
一样对待生成的requirements.txt
文件:
FROM golang:1.12.5 as builder
# NOT in $GOPATH (or explicitly set GO111MODULES=on)
WORKDIR /usr/src/test-ldap/
COPY go.mod .
RUN go mod download # alternatively: "go mod vendor" to build a vendor/ dir instead
COPY main.go .
# ...