我现在意识到 Go 将源代码的绝对路径保存在二进制文件中,以便打印堆栈跟踪等。我不想完全删除这些信息,但是,这也意味着构建相同程序的每个开发人员都会生成具有不同校验和的可执行文件。在我尝试使用
chroot
或类似的东西重新实现构建之前:有没有办法告诉 Go 不要为此目的使用绝对路径?
有没有办法告诉 Go 不要为此使用绝对路径?
现在有:
-trimpath
。
https://pkg.go.dev/cmd/go#hdr-Compile_packages_and_dependency解释:
-修剪路径
从生成的可执行文件中删除所有文件系统路径。 记录的文件名而不是绝对文件系统路径 将开始模块路径@版本(使用模块时), 或普通导入路径(使用标准库或 GOPATH 时)。
要扩展 erik258 响应,您还需要修复 GOPATH。
我认为如果您启用了模块,那并不重要。我只是将我的设置为 /home/runner/go 以匹配 github 运行者所拥有的内容,它的工作就像一个魅力。
这是我使用的整个构建命令,它在我的机器上和 GitHub 操作中生成完全相同的二进制文件
export CGO_ENABLED=0
export GOOS=linux
export GOARCH=amd64
export GOPATH=/home/runner/go
build="go build -trimpath -tags lambda.norpc -buildvcs=false -compiler gc"
$build -o cmd/lambda/package/bootstrap cmd/lambda/main.go