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

时间:2018-09-09 02:58:20

标签: go glide-golang

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

先运行go get -u ./...,然后运行go build main.go,会生成一个2377872字节的二进制文件。

清除从go get克隆的任何存储库的gopath,然后运行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 个答案:

答案 0 :(得分:2)

const {Builder, By, Key, until} = require('selenium-webdriver'); async function example(callback) { let driver = await new Builder().forBrowser('firefox').build(); driver.implicit = 5000; /* Set TOR browser instead ... */ await driver.manage().deleteAllCookies(); await driver.sleep(3000); /* Scrolls the page down */ driver.executeScript(function(){ window.scroll(0,3250); }); try { await driver.get('http://localhost'); await driver.findElement(By.xpath('(//button[@type=\'button\'])[4]')).click(); await driver.sleep(2000); /* switch to iframe */ let iFrame = driver.findElement(By.xpath('/html/body/div[4]/div/div[5]/div[1]/div/apester-layer/iframe')); await driver.switchTo().frame(iFrame); await driver.findElement(By.xpath('/html/body/div/div[1]/div/div/div[3]/div/ng-include/div[2]/div/div[4]/div[2]')).click(); // await driver.findElement(By.xpath('//div[2]/p')).click(); // await driver.findElement(By.name('q')).sendKeys('webdriver', Key.RETURN); // await driver.wait(until.titleIs('webdriver - Google Search'), 1000); } finally { await driver.sleep(3000); await driver.quit(); /* keep running test over and over */ callback(callback); } }; /* run 2 tests at once */ example(example); example(example); 默认在可执行文件中包含调试信息,包括源代码文件的路径。

当您拥有go build目录时,源文件的路径将比源文件位于vendor/内时更长。结果,调试信息将占用更多空间。

通过告诉GOPATH排除这样的调试信息,尝试比较已构建二进制文件的大小。

go build

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

(编辑:不包括调试信息时会包含源文件路径,并且go build -ldflags=-s ./ 的堆栈跟踪也可以证明源文件路径,因此此答案并不完整)