【问题标题】:"go build" became very slow after installing a new version of Go安装新版本的 Go 后“go build”变得非常慢
【发布时间】:2014-06-21 12:33:47
【问题描述】:

从 Go 1.2.1 升级到 1.3(Windows 7 64 位)后,“go build”执行时间从大约 4 秒增加到超过 45 秒。除了 go 版本更新,没有其他变化。关闭病毒扫描程序似乎没有任何效果。有什么线索吗?

【问题讨论】:

  • 您是否尝试过基准测试和/或降级回以前的版本?
  • 我尝试降级到1.3之前的上一个版本(也就是1.2.2),但是和1.3一样慢。接下来我会尝试 1.2.1。
  • 我怀疑这可能与软件的自我优化有关。也许如果你稍微使用 Go 1.3,它会再次有效地工作。不过,谢谢你的问题,我也很好奇是否有人有答案。 :)
  • 这和 jruby 有什么关系?

标签: go


【解决方案1】:

您可能有每次都重新编译的依赖项。尝试go install -a mypackage 重建所有依赖项。

删除$GOPATH/pkg 也有助于确保您没有旧的目标文件。

使用-x 标志构建将显示工具链是否发现不兼容的版本。

【讨论】:

    【解决方案2】:

    我也有同样的问题,运行这个命令就解决了:

    go get -u -v github.com/mattn/go-sqlite3

    另一个提示:http://kokizzu.blogspot.co.id/2016/06/solution-for-golang-slow-compile.html

    【讨论】:

    • 这究竟是如何解决的?它有什么加快速度的作用?
    • 我也遇到了同样的问题,原来我每建一个,go-sqlite3又重新建了一次。这确实解决了我的问题。
    • 出于某种原因它对我做了同样的事情......奇怪
    • JimB 的回答解释了这里发生的事情。 sqlite3 包必须已经升级,所以 Go 将从 Github 获取它并重建它。如果您手动执行go get -u 命令,它将正确升级本地副本,因此不需要重建。
    【解决方案3】:

    使用go1.6,

    只需运行go build -i

    它将编译所有依赖项并将它们作为 .a 文件存储在$GOPATH/pkg/*/*

    稍后当您运行go run main.go 时,一切都会快得多。

    真正棒的是,如果您使用 vendored 依赖项(即:项目中的供应商文件夹),则可以在 $GOPATH/pkg/**/yourproject/vendor/** 中适当地构建 deps

    因此您不必go get install/get/whatever 并拥有供应商/全局依赖项的混合。

    我怀疑你必须在 deps 更新后重新构建 .a 文件(glide 更新或类似这样的 smthg),但我还没有测试。

    【讨论】:

    • 如果您的项目在一个包中,例如api,您将运行go build -i api
    【解决方案4】:

    在 Go 1.10 之后,您只需输入 go build。您无需输入:go build -i

    来自 Go 1.10 文档草案,here


    构建和安装

    go build 命令现在仅根据源文件的内容、指定的构建标志和存储在已编译包中的元数据来检测过期包。修改时间不再被咨询或相关。 不再需要在修改时间因某种原因(例如,构建标志的更改)而误导的情况下添加 -a 以强制重建的旧建议:构建现在始终检测何时必须重建软件包。 (如果您发现其他情况,请提交错误。)

    ...

    go build 命令现在维护最近构建的包的缓存,与 $GOROOT/pkg 或 $GOPATH/pkg 中已安装的包分开。缓存的作用应该是加快构建速度不要显式安装包或在不同的源代码副本之间切换时(例如,在版本控制系统的不同分支之间来回切换时)。 不再需要添加 -i 标志以提高速度的旧建议,例如在 go build -i 或 go test -i 中:没有 -i 的构建运行速度一样快。有关更多详细信息,请参阅 go help cache。

    【讨论】:

      【解决方案5】:

      我刚刚遇到了同样的问题 - 从 1.4 更新到 1.5。正如go build -x 所示,旧版本似乎在某种程度上不兼容或每次都在重建。执行go get -v 会使所有包无效或重新获取它们,我不太确定,go build -x 显示的输出相当少。

      【讨论】:

      • 我认为这可能是最好的评论。
      【解决方案6】:

      你可以像这样构建 sqlite3:

      cd ./vendor/github.com/mattn/go-sqlite3/
      go install
      

      之后,您的项目将构建得更快。

      【讨论】:

        【解决方案7】:

        如果你按照其他人所说的那样尝试但仍然不行,我建议删除$GOPATH的目录,例如:

        sudo rm -rf $GOPATH
        cd yourproject 
        go get -d
        go get -u -v github.com/mattn/go-sqlite3
        

        【讨论】:

        • 这太危险了!大多数人将自己的代码保存在$GOPATH,这将删除所有内容
        • 看这个答案的人看不懂,不要做。
        猜你喜欢
        • 2013-10-14
        • 1970-01-01
        • 1970-01-01
        • 2014-02-13
        • 1970-01-01
        • 2019-07-07
        • 2018-12-28
        • 2019-04-21
        • 2019-11-05
        相关资源
        最近更新 更多