为什么在使用供应商目录中的依赖项与 gopath 中的依赖项构建时,go 应用程序二进制文件的大小不同?
Why is a go application binary different sizes when building using dependencies in a vendor directory vs dependencies in gopath?
我有一个 main.go 文件和一个 glide.yaml 文件(请参阅下面的源代码)在干净的 gopath 中(没有其他存储库)
运行 go get -u ./...
然后 go build main.go
生成一个大小为 2377872 字节的二进制文件。
清理从 go get
和 运行 glide update
克隆的任何存储库的 gopath,然后 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 build
默认在可执行文件中包含调试信息,包括源代码文件的路径。
当您有 vendor/
目录时,源文件的路径将比源文件位于 GOPATH
中时更长。如此一来调试信息会占用更多space.
尝试通过告诉 go build
排除这样的调试信息来比较构建二进制文件的大小。
go build -ldflags=-s ./
这减少了大小差异。有关链接器标志的更多详细信息,请参阅 https://golang.org/cmd/link/。
(编辑:当不包括调试信息时源文件路径也包括在内,panic()
的堆栈跟踪也证明了这一点,所以这个答案是不完整的)
我有一个 main.go 文件和一个 glide.yaml 文件(请参阅下面的源代码)在干净的 gopath 中(没有其他存储库)
运行 go get -u ./...
然后 go build main.go
生成一个大小为 2377872 字节的二进制文件。
清理从 go get
和 运行 glide update
克隆的任何存储库的 gopath,然后 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 build
默认在可执行文件中包含调试信息,包括源代码文件的路径。
当您有 vendor/
目录时,源文件的路径将比源文件位于 GOPATH
中时更长。如此一来调试信息会占用更多space.
尝试通过告诉 go build
排除这样的调试信息来比较构建二进制文件的大小。
go build -ldflags=-s ./
这减少了大小差异。有关链接器标志的更多详细信息,请参阅 https://golang.org/cmd/link/。
(编辑:当不包括调试信息时源文件路径也包括在内,panic()
的堆栈跟踪也证明了这一点,所以这个答案是不完整的)