Bundler バージョン1.10がリリースされました（翻訳）

## はじめに

本日、Bundler 1.10.5 がリリースされました。
このバージョンは新機能が追加されただけでなく、最近Rubyの開発現場を混沌とさせていたBUNDLED_WITH問題を改善するための変更も含まれています。

新機能やBUNDLED_WITH問題の改善に関する詳しい情報は以下のブログに書かれています。

[Bundler: Version 1.10 released](http://bundler.io/blog/2015/06/24/version-1-10-released.html)

ただし、結構な量があるので英語に詳しい人でないと読み下すのがしんどいかもしれません。
そこでこのブログの内容を日本語訳してみることにしました。

翻訳を読んでもらえれば分かると思いますが、 **Bundlerの開発チームはみなさんが Bundler 1.10にアップグレードすることを強く推奨しています。**

私たちもできるだけ早くBundler 1.10以上（最低でも1.9.10）にアップデートして、Bundler 開発チームのみなさんを助けてあげましょう！

### 翻訳の方針について

翻訳は日本語としての読みやすさを重視してところどころ意訳しています。
もし完全に間違った訳になっていたり、意訳しすぎて原文のニュアンスが変わってしまったりしているところがあれば、コメントや編集リクエスト等でやさしく指摘やってください。

### 関連Qiita記事（BUNDLED_WITH問題に言及している記事）

- [BUNDLED WITH で Gemfile.lock が更新されてしまう件](http://qiita.com/suu_g/items/2b1630b8015d51c5292e) (@suu_gさん)
- [Bundler 1.10.Xを使うために](http://qiita.com/ka_/items/3724e13648207696be2d) (@ka_さん)
- [Bundler1.10.XからGemfile.lockの書式がちょっと変わってる件について](http://qiita.com/HiromiKai_Green/items/09b33ec537cb4d9bc9c8) (@HiromiKai_Greenさん)

## Bundler バージョン1.10がリリースされました（翻訳）

Bundler 1.10 がリリースされました！ 正確に言うと 1.10.5 が本日リリースされました。私たちはこのリリースがBundler 1.10をみなさんに知ってもらういい機会だと考えています。

今回のリリースでは数多くの新機能が登場しています。具体的には `lock` コマンド、スクリプト内にインラインで記述できるgemfileのサポート、インストール後に表示されるメッセージの無効化、オプショングループ、条件付きのgemインストール、大きく改善された `outdated` 出力、インストールされたgemを強制的にダウンロードし再インストールするオプション、などなどです。

### 新機能について

最初に新しい `lock` コマンドを紹介します。`bundle lock` を実行すると Gemfile 内の依存関係を解決し、Gemfile.lock を更新します。ただし、gemをダウンロードしたりインストールしたりすることはしません。

次に、gem に依存している一枚モノのスクリプトファイルのために `gemfile` メソッドが提供されます。これは `require "bundler/inline"` することで使えるようになります。このメソッドは lock ファイルを生成しません。なので、使いたいgemのバージョンには十分注意してくださいね！詳しい内容や使用例については[こちらのインラインドキュメント](https://github.com/bundler/bundler/blob/master/lib/bundler/inline.rb)を参照してください。

あなたは「HTTPartyしろ」と言われることに飽き飽きしてますか？（訳注：HTTParty gemをインストールすると"When you HTTParty, you must party hard!"というメッセージが表示されます）このオプションはそんなあなたのためにあります。 `bundle config ignore_messages.httparty true` というコマンドを実行するとHTTPartyは永久に無口になります。もしくは `bundle config ignore_messages true` を実行するとすべてのメッセージが永久に無効化されます。

オプショングループに空飛ぶジェットパックが付いていたら、どれくらいの人がインストールしたがるでしょうか？以前からデフォルトでインストールされないグループを作りたいという要望を聞いていましたが、その機能がようやく完成しました。オプション扱いにしたいグループがあれば `group :name, optional: true do` と書いてください。そして、そのオプショングループをインストールしたければ `bundle install --with name` でインストールしてください。

オプショングループがようやく完成したのと時を同じくして完全に自動的にインストールされる（またはインストールされない）グループを追加しました。ラムダ、もしくはProcを使って `install_if` グループに書かれたgemをインストールするかどうか（またはインストールしないか）を判別することができます。使用例については [Gemfile のマニュアル](http://bundler.io/v1.10/man/gemfile.5.html#INSTALL_IF-install_if-)を参照してください。

変更点はまだいくつかあります。すべて知りたい場合は [1.10のChangelog](https://github.com/bundler/bundler/blob/1-10-stable/CHANGELOG.md) をチェックしてください。

### BUNDLED_WITH について

このリリースにはちょっとした議論を巻き起こしている変更点も含まれています。その変更点とは Bundler 1.10ではBundlerのバージョンを `Gemfile.lock` に追加するところです。

1つのBundler バージョンにつき lock ファイルが変更されるのは1回だけ、というのが私たちの意図したワークフローだったのですが、現実はなかなか思った通りにいきませんでした。 **たった一言で** 済ませるなら、この問題は（一部のメンバーだけでなく）チームメンバー全員がBundler 1.9.10以上にアップグレードすれば解決します。

詳しい説明は以下の通りです。Bundler 1.10は BUNDLED_WITH セクションを追加します。一方、Bundler 1.9 はそれを削除します。1.9以前のバージョンを使う開発者と1.10以上を使う開発者がチームで混在していると、lockファイルがコミットするたびに古くなったり新しくなったりする状況が発生します。一番単純な解決策は `gem install bundler` を実行して1.10にアップグレードすることです。Bundler 1.10以上であれば BUNDLED_WITH セクションがあってもそれを残したままにします。

この変更は私たちが予想していたよりも大きな問題を引き起こしました。その原因になったのはSpringの挙動です。それがわかったので、私はこの問題の影響を小さくするために大きな仕様変更を実施しました。とはいえ、時すでに遅しなんですが。。。新しい設計では `bundle install` または `bundle update` を実行した場合だけ、この変更を有効化します。`bundle exec` を実行した場合は lock ファイルは変更されません。また、私たちはSpringのことを考慮していませんでした。Springは何も言わずにバックグラウンドで `bundle install --local` を実行し続けるのです。この問題に対処するため、私たちは Bundler 1.10.4 をリリースしました。

最後の問題は 1.9 から 1.10 へのアップグレードを拒否する開発者がいることです。その理由がなんであれ、これだと問題は残り続けます。とりあえず言っておきたいことは、今日のリリースがバージョン1.9の最終アップデートだということです。今回のアップデートは BUNDLED_WITH セクションを削除するのではなく単に無視するための変更でした。

こうした変更を実施した理由は本当に単純なものです。私たちは古いBundlerに起因するバグレポートが届くことに長い間困らされています。ユーザーはそのプロジェクトで使えないぐらい古いBundlerを使っているにもかかわらず、それを私たちに知らせる手段がないのです。私たちは1.0.0がリリースされた直後から lock ファイルに Bundler のバージョンを埋め込んでこの問題に対処したいと思っていました。ただ残念なことに 1.0.x の lock パーサにはバグがあり、私たちは 1.0 が使われなくなるまで待たなければなりませんでした。また、私たちは Bundler バージョンのトラッキングも開始しなければなりません。なぜなら私たちは 2.0 のリリースを計画しているからです（2.0では大きな新機能が追加される代わりに後方互換性が失われます）。

このように説明すると「バグフィックスバージョンではなく、マイナーバージョンだけをトラッキングすることはできないんですか？」と聞いてくる人が出てきます。「1.10だけにするのはどうですか？そうすればコミット履歴が混沌とするのを防げるのではないですか？」そんなふうに考える方も中にはいるかもしれませんが、二つの大きな理由があるため、私たちはパッチレベルまでトラッキングすることにしました。

まず最も重要なポイントは、みなさんが1.10以上にアップグレードすればコミット履歴が混沌とする問題が解消される、ということです。バージョン 1.10.1 は 1.10.3 で bundle された lock ファイルを変更しません。全員がBundler 1.9.10以上にアップグレードすれば Bundler のバージョンひとつにつき、発生するコミットは最悪でも1回だけです。それ以上のコミットが発生することはありません。

次に、Bundlerのパッチレベルはまさにバグ修正のバージョンを指し示すものです。そして、ここで修正されるようなバグは一部のユーザーが `bundle install` できなくなるぐらい大きなものだったりすることがよくあります。マイナーバージョンだけをトラッキングすることはRailsのマイナーバージョンだけをトラッキングしているのと同じことです。「バージョン4.2.xのRailsだったらどれを使ってもいいよ」なんて普通言わないですよね。なぜなら、x が異なればRailsに含まれるセキュリティホールや大きなバグ、その他の問題の詳細も変わってくるからです。

なので最後にお伝えしたいのは、この変更はみなさんの現場に混乱を引き起こすために導入したのではない、ということです。私たちは影響を少なくするためにベストを尽くしていますし、この問題はBundler 1.10 （もしくは1.9を使い続けたいというメンバーがあなたのチームにいるなら、最新バージョンの1.9でも良いです）にアップデートすれば完全に解決されるものです。

みなさんのフィードバックに感謝します！

## 2015.6.26追記： 日本語訳（＝この記事）へのリンクを付けてもらいました

Twitterで「翻訳したよ」って伝えたら、公式ブログにこの記事へのリンクを付けてもらいました。
いや～、うれしいですね！

![Screen Shot 2015-06-26 at 8.49.43.png](https://qiita-image-store.s3.amazonaws.com/0/7465/ae291453-45f1-ac4c-3404-de44801b52ff.png)
<blockquote class="twitter-tweet" lang="en"><p lang="en" dir="ltr"><a href="https://twitter.com/jnchito">@jnchito</a> that’s great! is it okay to link to your translation from the original post?</p>&mdash; literally misandré (@indirect) <a href="https://twitter.com/indirect/status/613896859707256832">June 25, 2015</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>