2

我在干净的 gopath 中有一个带有 glide.yaml 文件的 main.go 文件(源代码见下文)(没有其他存储库)

运行go get -u ./...然后go build main.go生成大小为 2377872 字节的二进制文件。

清理从 克隆的任何 repos 的 gopath ,然后go get运行生成大小为 2457328 字节的二进制文件。glide updatego build main.go

如果没有代码更改,为什么二进制文件大小不同?有什么go build不同?为什么有供应商目录(或没有供应商目录)会影响这个大小?

使用的软件版本

glide version 0.13.1
go version go1.10.3 darwin/amd64

main.go

package main

import (
    log "github.com/sirupsen/logrus"
)

func main () {
    log.WithFields(log.Fields{
        "qqs": "q1",
    }).Info("Why are binaries different?")
}

滑翔.yaml

package: github.com/chuyval/qqs/q1
import:
- package: github.com/sirupsen/logrus
  version: 1.0.6
4

1 回答 1

2

go build默认情况下,在可执行文件中包含调试信息,包括源代码文件的路径。

当你有一个vendor/目录时,源文件的路径将比你在其中的源文件更长GOPATH。结果,调试信息会占用更多的空间。

go build尝试通过告诉排除调试信息来比较构建二进制文件的大小。

go build -ldflags=-s ./

这减少了大小的差异。有关链接器标志的更多详细信息,请参见https://golang.org/cmd/link/

(编辑:当不包含调试信息时包含源文件路径,并且由 a 的堆栈跟踪证明panic(),因此此答案不完整)

于 2018-09-09T06:22:10.573 回答