为什么在使用供应商目录中的依赖项与gopath中的依赖项构建时,应用程序二进制文件的大小不同?

问题描述 投票:2回答:1

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

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

清理从go get克隆的任何回购的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个回答
2
投票

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

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

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

go build -ldflags=-s ./

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

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

© www.soinside.com 2019 - 2024. All rights reserved.