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

标签 go glide-golang

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

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

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

如果没有代码更改,为什么二进制文件的大小不同? go build 有何不同之处?为什么有 vendor 目录(或没有 vendor 目录)会影响这个大小?

使用的软件版本

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 内时更长。这样一来,调试信息就会占用更多的空间。

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

go build -ldflags=-s ./

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

(编辑:当不包含调试信息时包含源文件路径,并且由 panic() 的堆栈跟踪证明,因此这个答案不完整)

关于go - 为什么在使用 vendor 目录中的依赖项与 gopath 中的依赖项构建时,go 应用程序二进制文件的大小不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52240961/

相关文章:

google-app-engine - Appengine数据存储已损坏,如何重置

go - 如何在beego上添加favicon.ico?

google-app-engine - 通过id获取实体

go - 在 VS Code 中找不到销售包

go - 为什么 “undefined: StackGuardMultiplierDefault”错误?

go - 在 golang 的 map 中使用 string[][] 时复合文字中缺少类型

go - Go 如何确定可以使用多个值的上下文?

git - 去使用 ssh 而不是 https(不在 github 上)

json - 如何在 golang 中打印未编码的数据?

go - 未找到https://gonum.org/v1/gonum