【问题标题】:Why is a go application binary different sizes when building using dependencies in a vendor directory vs dependencies in gopath?为什么在使用供应商目录中的依赖项与 gopath 中的依赖项构建时,go 应用程序二进制文件的大小不同?
【发布时间】:2018-09-09 02:58:20
【问题描述】:

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

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

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

如果没有代码更改,为什么二进制文件大小不同? 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?")
}

glide.yaml

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

【问题讨论】:

    标签: go glide-golang


    【解决方案1】:

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

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

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

    go build -ldflags=-s ./
    

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

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

    【讨论】:

    • 使用go build -ldflags=-s ./ 给了我同样的结果。我发现使用-w 标志将大小减少到 1552112 与供应商目录和 1550480 没有供应商目录。仍然不同,但有道理为什么他们会同意你的解释。
    • @chuy 也许是因为我使用的是 Go 1.11,所以我看到生成的二进制文件大小相同,只有 -s 标志。当然还有更多的事情发生,也许如果我有更多的依赖项,大小会有所不同。 panic() 上的堆栈跟踪仍然需要一些源文件信息,所以也许这就是使用额外空间的地方......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-28
    • 1970-01-01
    • 1970-01-01
    • 2013-01-30
    • 2017-05-14
    • 2013-09-03
    相关资源
    最近更新 更多