Почему двоичные приложения 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()
так что этот ответ не полный)