为什么go应用程序在使用供应商目录中的依赖项与gopath中的依赖项进行构建时大小不同?
我在一个干净的gopath中有一个main.go文件和一个glide.yaml文件(源代码见下文)(没有其他存储库) 运行为什么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有什么不同之处?为什么有供应商目录(或没有)会影响此
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()
上的堆栈跟踪仍然需要一些源文件信息,因此可能这就是使用额外空间的地方。。。