RubyGemsからの離脱
Vagrant 1.1以降では、インストール方法としてのRubyGemsのサポートが終了しました。代わりに、あらかじめ用意されたパッケージやインストーラーを使ってVagrant 1.1以降をインストールする必要があります。gemベースのインストールに慣れた方々にとっては、この変更は困惑や反発を招きました。この記事では、RubyGemsの利用をやめた理由と、長期的に見てVagrantコミュニティにとってなぜその方が良いのかを説明します。
3年以上前にVagrantを初めてリリースした際、私はRubyGemとして公開しました。VagrantはRubyで書かれており、当時はすでにRubyGemsの作成にも慣れていたため、自然な配布方法だと考えたのです。
この決断を後悔したことは一度もありません。Rubyコミュニティは最先端の技術に対して非常にオープンで、RubyGemとして配布したことがプロジェクト初期の普及を大きく後押ししたと考えています。
しかし、その後さまざまな経験を積む中で、多くの理由からRubyGemsがもはや最善の選択ではないと考えるようになりました。
この記事では、インストーラーがVagrantユーザーにとってなぜ利便性を高めるのかを説明します。プラグイン開発者やそのエコシステムへの影響については、別の記事で取り上げる予定です。
Rubyを使わないユーザー
2010年の最初のリリース以来、Vagrantは数百社の企業と数千人のユーザーに利用されるまでに成長しました。正確な数字を示せるわけではありませんが、私が出会ってきたVagrantユーザーの大半はRuby開発者ではありません。
インストーラーを用意する以前、Vagrantについて最も多く寄せられた不満はRubyGemsに関するものでした。私自身はRubyを扱っているため、RubyGemsはシンプルだと思っていました。しかし、Rubyコミュニティの外にいる人にとっては、RubyGemsを学び、Rubyをインストールするといった負担自体が高い導入障壁となり、Vagrantのインストールすら試さない人が多いことを知りました。
一方で、Rubyを含むVagrantのすべての依存関係を同梱したパッケージであれば、Vagrantのインストールは極めて簡単になります。
不具合
Vagrantは多くの外部依存関係を抱えています。Ruby、RubyGems、OpenSSL、zlib、JSONなどです。RubyGemsによる配布では、これらの依存関係を利用者がソースから、あるいは各自のパッケージマネージャーを使って手動でインストールする必要がありました。
このような柔軟性がある一方で、あらゆる環境でVagrantをテストすることは不可能でした。自分の環境やインストール済みの依存関係のバージョンでは動作することを確認できても、すべての環境で動くかどうかは分からなかったのです。
そのため、依存関係が古すぎたり、バグを抱えていたり、権限エラーなどで単に壊れていたりすることが原因でVagrantが動かない、という不具合報告が頻繁に寄せられました。
それが私の責任と見なされようと、ユーザーの責任と見なされようと、どちらでも構いません。適切なバージョンをインストールしなかったからといってユーザーを責めるつもりはありません。特に、パッケージリポジトリにあるものをそのまま入れただけならなおさらです。
しかし、壊れた環境が原因でVagrantがクラッシュし、それがVagrant自体の不安定さだと受け取られてしまうのは非常に大きな問題です。実際には10回中9回は、環境設定の不備が原因なのです。
インストーラーであれば、Vagrantが必要とするすべての依存関係を同梱して出荷でき、それらと組み合わせれば確実に動作することをユーザーに保証できます。これは特にWindows環境で大きな助けになります。
柔軟性
環境を厳密に管理できるようになったことで、Vagrantが依存するライブラリを改善し、きめ細かく調整できるようになりました。
Vagrant 1.1では、これまで使っていた低速な純Ruby製のtarライブラリを、C言語で書かれた高性能で安定性と柔軟性に優れたアプリケーション兼ライブラリであるlibarchiveに置き換えました。libarchiveは現在すべてのVagrantインストーラーに同梱されているため、ユーザーは新たな依存関係をインストールする必要はなく、Vagrantが内部で何を使っているかを意識する必要もありません。
Vagrant 1.2では、ダウンローダーを純RubyのHTTP実装からcURLに置き換えました。こちらのほうがはるかに高速で、FTPをはじめとする多くのネットワークプロトコルに対応しています。すべてのインストーラーにcURLがあらかじめ組み込まれて提供されるため、今回もユーザーが気にする必要はありません。
将来的には、純Ruby製のSSHライブラリを、より安定し保守が行き届いたC言語製のSSHライブラリに置き換える予定です。今回もユーザーが意識する必要はありませんが、SSHがより安定したことは実感していただけるはずです。
これらの変更により、ユーザーに気づかれることなく、依存関係に大きな変更を加えられるようになりました。実際、ユーザーが気づくのは、Vagrantの使い心地が格段に良くなったということだけです。動作は速くなり、クラッシュは減り、対応する機能も増えました。
総じて、RubyGemsでの配布では安全に行えなかった変更が可能になったことで、Vagrantは大きく改善されました。
記事をランダムに読む