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

为什么go应用程序在使用供应商目录中的依赖项与gopath中的依赖项进行构建时大小不同?,go,glide-golang,Go,Glide Golang,我在一个干净的gopath中有一个main.go文件和一个glide.yaml文件(源代码见下文)(没有其他存储库) 运行go get-u./…然后go build main.go生成一个大小为2377872字节的二进制文件 清理从go-get克隆的任何repo的gopath,并运行glide-update然后go-build-main.go生成大小为2457328字节的二进制文件 如果没有代码更改,为什么二进制文件大小不同? go build有什么不同之处?为什么有供应商目录(或没有)会影响此

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

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

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

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

使用的软件版本

glide version 0.13.1
go version go1.10.3 darwin/amd64
梅因,加油

package main

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

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

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

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

当您有一个
供应商/
目录时,源文件的路径将比您将源文件放在
GOPATH
中时长。因此,调试信息将占用更多空间

尝试通过告诉
go build
排除如下调试信息来比较生成二进制文件的大小

go build -ldflags=-s ./
这减少了大小的差异。有关链接器标志的更多详细信息,请参阅


(编辑:当调试信息不包括时,源文件路径也包括在内,这可以通过
panic()
的堆栈跟踪来证明,因此这个答案不完整)

使用
go build-ldflags=-s./
给了我相同的结果。我发现使用
-w
标志可以将具有供应商目录的大小减少到1552112,而不具有供应商目录的大小减少到1550480。仍然不同,但有道理解释为什么它们会与您的解释一致。@chuy可能是因为我使用的是Go 1.11,所以我看到生成的二进制文件大小与
-s
标志相同。当然还有更多的事情要做,如果我有更多的依赖关系,那么大小会有所不同。
panic()
上的堆栈跟踪仍然需要一些源文件信息,因此可能这就是使用额外空间的地方。。。