Почему двоичные приложения go имеют разные размеры при построении с использованием зависимостей в каталоге вендора и зависимостей в gopath?

У меня есть файл main.go с файлом glide.yaml (см. Исходный код ниже) в чистом gopath (других репозиториев нет)

Бег go get -u ./... затем go build main.go генерирует двоичный файл размером 2377872 байта.

Очистка гопата от любых репо, которые были клонированы из go getи работает 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

1 ответ

Решение

go build по умолчанию включает отладочную информацию в исполняемый файл, включая путь к файлам исходного кода.

Когда у вас есть vendor/ каталог путь к исходным файлам будет длиннее, чем когда вы исходные файлы лежат внутри GOPATH, В результате отладочная информация займет больше места.

Попробуйте сравнить размер встроенного двоичного файла, сказав go build чтобы исключить отладочную информацию, как это.

go build -ldflags=-s ./

Это уменьшает разницу в размере. Смотрите https://golang.org/cmd/link/ для более подробной информации о флагах компоновщика.

(Изменить: пути к исходным файлам включены, когда отладочная информация не включена, а также подтверждается следами стека от panic() так что этот ответ не полный)

Другие вопросы по тегам