Golangのbundleコマンド

  • 26
    Like
  • 0
    Comment
More than 1 year has passed since last update.

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にはgurugorenameなどGopherに必要なツールがたくさん揃っている.基本的にこれらは必要なものをそれぞれインストールするのがプラクティスになっている.例えばbundleコマンドは以下のようにインストールする.

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

このプラクティスに従っていれば無意識のうちに名前被り問題が発生することはない.が以下のような横着をしてx/toolsの全てのコマンドをインストールすると気づかないうちに問題が発生してしまうかもしれない.

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

x/toolsは必要なものを一つずつインストールしましょう.

まとめ

使われどころを知ればおそらく多くのひとにとって必要無いことがわかるのではないでしょうか.使われることも少ないので特に衝突などは考慮していなかったのだと思います.