Help us understand the problem. What is going on with this article?

Golangのbundleコマンド

More than 3 years have 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は必要なものを一つずつインストールしましょう.

まとめ

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

mercari
フリマアプリ「メルカリ」を、グローバルで開発しています。
https://tech.mercari.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした