RubyGemsを捨てる
原文は Mitchell Hashimoto により に公開されました。 このブログを購読する
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がクラッシュし、それがVagrant自体の不安定さだと受け取られてしまうのは大きな問題です。10回中9回は、原因は環境の不備にあるにもかかわらずです。
インストーラがあれば、Vagrantが必要とするすべての依存関係を同梱して出荷でき、それらと組み合わせて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の体験が格段に良くなったということだけです。動作は速くなり、クラッシュはなくなり、Vagrantはより多くの機能をサポートするようになりました。
全体として、RubyGemsでの配布では安全に行えなかった変更が可能になったことで、Vagrantは大きく改善されました。
記事をランダムに読む
コメント
ログインしてコメントする