Golang的bundle命令

我在Twitter上看到了有关Golang的bundle命令的困惑。很可能是因为它与Ruby的bundler发生了命名冲突。

只要是这个命令,可能大多数人将来都不会使用它,所以不需要担心。这是一个在Go1.6中引入HTTP/2时添加到x/tools中的强大命令(最初是由Russ Cox先生创建的)。我认为安装它的人可能是在追踪这个功能的进展(顺便说一下,我曾经忘记已经安装了它,以为运行了Ruby的bundle,结果却运行了Golang)。

bundle命令是什么?

bundle是将一个包的命令作为一个单一文件的命令。使用方式如下:

$ bundle golang.org/x/net/http2 net/http http2

当执行上述命令时,可以将golang.org/x/net/http2包以http2为前缀嵌入到net/http包中作为一个文件。

为什么需要bundle命令呢?

如前所述,该命令在Go1.6的HTTP/2支持下被引入到x/tools中。Go1.6的HTTP/2支持的目标是“无需更改API即可立即使用”。

简单来说,如果考虑到只需要使用golang.org/x/net/http2,那应该将其设为外部引用(vendoring)。

x/net/http2 -> net/http (Handlerを実装するのに必要)

net/http -> x/net/http2(APIを変更しないために必要)

发生了循环引用的问题。在解决这个问题并实现目标的过程中,选择了bundle命令。可以通过查看链接”http -> http2 -> http import cycle”来获得更详细的信息(bundle仍然是主要的开发工具,用于忽略测试,现在它被定期捆绑到标准包中,代码主要在golang.org/x/net/http2进行开发)。

怎样安装呢?

(附言)

x/tools 中集成了许多对于Gopher来说必不可少的工具,如guru和gorename等。一般来说,安装这些工具都是一种惯例。例如,bundle命令的安装如下所示。

$ go get golang.org/x/tools/cmd/bundle

如果按照这个实践进行操作,就不会无意识地发生名称冲突问题。但是,如果采取以下类似的懒惰做法安装x/tools的所有命令,可能会在不知不觉中引发问题。

$ go get golang.org/x/tools/...

让我们逐个安装所需的x/tools组件。

总结

如果知道它的使用场景,可能会明白对许多人来说它是不必要的。因为使用率很低,所以可能没有考虑到特别的冲突等情况。

广告
将在 10 秒后关闭
bannerAds