私が初めて Ruby Gem について知ったとき、それはとても魔法のように思えました。 bundle install
を実行することで、この魔法の宝石を手に入れ、私のコードをあらゆる種類のものにすることができましたが、それは私の平社員としての能力をはるかに超えているように思えました。
私はブログを使って、私の好奇心を刺激する、そして私が完全に理解できないプログラミング概念を深く掘り下げていこうと思っています。 最初のブログ投稿では、Ruby gems の神秘的で魔法のような性質を論破しようと思います。
Ruby Gem とは?
いいえ、Ruby gems は魔法ではありません。 Ruby のコードを含むオープンソースのライブラリに、ちょっとした追加データをパッケージングしたものです。
Gem はあらゆる種類の目的に使用することができ、https://rubygems.org/ でさまざまな Gem を調べることができます。
- Bundler – 必要な gems とバージョンを正確に追跡してインストールすることにより、Ruby プロジェクトのための一貫した環境を提供します。
- RSpec – Ruby の Behavior Driven Development をサポートするテストフレームワーク。 ユーザーのログインが必要な Web サイトでは、Devise はサインイン、サインアップ、パスワードのリセットなどを扱います。
- JSON – テキストから JSON をパースするための API を提供。 Rails は、Ruby を Web アプリケーションに変換できるフルスタックフレームワークを提供します。
Installing Gems
Today, using gems is easy! gems をローカルにインストールするのは、コマンド 1 つで簡単にできます。 gem install
. インストール コマンドはコードを取得し、それをコンピューターにダウンロードし、gem と必要な依存関係をインストールします。 最後に、インストールされた gems のドキュメントをビルドします。
Bundler など一部の gem では 1 つの gem のみを必要としますが、他の gem には依存関係があり、複数 gem のインストールを必要とするものもあります。
ローカルにインストールされたすべての gems を見るには、gem list
コマンドを使用します。
Using Gems
さて、もっと重要なのは、インストールした gems をどのように使用するかです。 まあ、それは gem の種類によります。 Rails のように、コマンドから実行できるスタンドアロンの Ruby プログラムである gems もあれば、それだけでは比較的役に立ちませんが、プロジェクト内で使用すると非常に便利です。 コード内から gem を使用するには、ファイルの先頭で最初にそれを要求する必要があります – require 'gem_name'
。 例えば、Pryはプロジェクトで作業する際に、すぐに私のお気に入りのgemの1つになりました。 私のコード i̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶ ̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶ ̶̶̶̶̶̶̶̶̶̶ ̶̶̶̶̶ ̶̶ – -を書いた当初はほとんど正しくありませんでした。 先週は、API について学び、プロジェクトを完了するために Pry と他のいくつかの gems が必要でした。
gems は自分のコンピューターだけで必要とするなら非常に簡単ですが、プロジェクトを配布または公開する場合は少し複雑になります。 あなたのプロジェクトを実行する他の人は、必要なすべてのgemsと正しいバージョンを自分のコンピュータにインストールする必要があります。 ありがたいことに、RubyGems と Bundler がこのプロセスを合理化してくれます。
RubyGems は Gem の共有を簡単にするフレームワーク
Gems の魔法の一部は、誰もがそれを使用できることであり、RubyGems はそれを可能にするパッケージ マネージャーです。 RubyGems は、Ruby の gems を配布するための標準フォーマットを提供し、gems のインストールを管理し、gems を配布するためのサーバを提供します。 RubyGemsは2004年3月14日(円周率の日!)まで一般に公開されていませんでしたが、Ruby1.8から存在し、Ruby1.9までは標準Ruby配布物の一部ではありませんでした。
How did Rubyists ever live without RubyGems?
Life was a lot hard. 全容を知りたい方は、RailsConf 2015のAndré Arkoのプレゼン「How does Bundler work, anyway?」を見ることを強くお勧めします。 以下は私の要約版です:
ロードコーディングは require
から始まり、require
を使うことは本質的にはコードをファイルに挿入するのと同じことです。 最も単純な形では、引数ファイルからコードを抽出するメソッドです。
def require(filename)
eval File.name(filename)
end
Require では、ユーザーの $LOAD_PATH からファイルを検索して、ユーザーが任意のローカル コードを読み込むことができます。 $LOAD_PATH はグローバル変数であり、絶対パスの配列です。 コードのディレクトリが $LOAD_PATH 内のどこかにある限り、require
はそれを見つけることができます。
require
はローカルなコードには最適ですが、他の誰かからコードを取得したい場合はどうしたらよいでしょうか。 コードを見つけ、ダウンロードし、コンピュータのどこかに保存し、それを $LOAD_PATH のどこかに追加する必要がありました。
その結果、setup.rb はこのプロセスを容易にするために進化しました。 Setup.rb (これは現在も存在します) は、Ruby スクリプトとライブラリの汎用インストーラです。 すでに $LOAD_PATH に入っているディレクトリにすべての Ruby ファイルをコピーするため、require
よりも大きな改善となりました。 開発者は本質的に怠け者なので、setup.rb は私たちにいくつかのステップを節約してくれました。 しかし、setup.rbにはそれなりの問題がありました。 バージョン管理もなければ、プログラムをアンインストールする方法もないのです! どのバージョンかを知る唯一の決定的な方法は、インストール時にバージョン番号を書き留めることでした。
そして2004年、RubyGems が登場しました。 2004 年に RubyGems が登場し、他の人のコード、つまり gems をコマンド 1 つでインストールまたはアンインストールできるようになったのです! これは革命的なことでした。 RubyGems にはもうひとつのトリックがあり、異なるバージョンのソフトウェアを扱うことができ、すべてのバージョンは別々のフォルダーに保存されました。 RubyGems の現在の設定では、ある開発者が gem install foo
を実行してアプリケーションで新しい gem を使い始めると、プロジェクトの他の開発者は gem install foo
を実行するように指示される必要がありました。 ある種の gem は他の gem の特定のバージョンとしか動作せず、gem とバージョンの依存関係を調整することはますます困難になっていました。 Bundler は、必要な正確な gems とバージョンを追跡してインストールすることにより、gem のバージョン依存性の問題を解決するために存在します。 Bundler は Ruby gem の “gemfile” を通して動作し、Bundler にどの gem をどこで探すか指示します。 https://rubygems.org がデフォルトのソースですが、プライベート サーバーに gem が存在する場合、そのソースは特定の gem に対して上書きできます。
必要な gems をインストールした後 (コンピューターにまだない場合)、Bundler はインストールしたすべての gems とバージョンを別のファイル Gemfile.lock に書き込みます。 このロック ファイルにより、アプリケーションを実行するすべてのマシンにまったく同じバージョンをインストールすることが可能になります。
Bundlerの使用方法は簡単です。 まず、インストールする必要がありますが、Bundler は gem そのものなので、次のようにしてインストールできます。 gem install bundler
. Bundler をインストールすると、2つのステップでプロジェクトで任意の gem を使用できます。
- プロジェクトのルートにある Gemfile に gem を追加する
- ターミナルで
bundle install
を実行する
Bundler についての詳細は、http://bundler.io/.
を参照してください。