Golangのbundle
コマンドに関する困惑をTwitterで見かけた.おそらくRubyのbundlerと名前が衝突するためだろう.
ただこのコマンドはおそらく多くのひとは今後使うことはないため気にする必要はない.これはGo1.6でHTTP/2をぶっ込むときにx/toolsに入れられたパワー系コマンドである(もともとはRuss Cox氏が作っていた).インストールしているのはおそらくこの対応の経緯を追っていた人だと思う(ちなみに僕はこれをインストールしたのを忘れていてRubyのbundle
を実行したつもりがGolangのほうを実行してしまったことがある).
bundleコマンドとは何か?
bundleはパッケージを別パッケージとして1つのファイルにするコマンド.以下のように使われる.
$ bundle golang.org/x/net/http2 net/http http2
上記のコマンドを実行するとgolang.org/x/net/http2
パッケージをnet/http
パッケージの中にhttp2
というprefixをつけて1つのファイルとしてぶっ込むことができる.
なぜ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を変更しないために必要)
でimport cycleが発生してしまう.この問題を解決しつつ目標を達成するための選択肢がbundle
コマンドだった.というのが経緯になる.より詳しくは"http -> http2 -> http import cycle"を見ると良い(bundle
はテストを無視するため現在でもメインの開発はgolang.org/x/net/http2で行われ定期的に標準パッケージの方にbundle
されている).
どのようにインストールするのか?
(追記)
x/toolsにはguru
やgorename
などGopherに必要なツールがたくさん揃っている.基本的にこれらは必要なものをそれぞれインストールするのがプラクティスになっている.例えばbundle
コマンドは以下のようにインストールする.
$ go get golang.org/x/tools/cmd/bundle
このプラクティスに従っていれば無意識のうちに名前被り問題が発生することはない.が以下のような横着をしてx/toolsの全てのコマンドをインストールすると気づかないうちに問題が発生してしまうかもしれない.
$ go get golang.org/x/tools/...
x/toolsは必要なものを一つずつインストールしましょう.
まとめ
使われどころを知ればおそらく多くのひとにとって必要無いことがわかるのではないでしょうか.使われることも少ないので特に衝突などは考慮していなかったのだと思います.