Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

RubyGemの内部

周りの子供たちを集めて、おじいちゃんに人生が大変だった昔のことを話させてください。宝石を設置することは、頭痛を引き起こし、髪を引っ張って、歯を食いしばる試練でした。

私がRubyを始めたばかりの頃は、Bundlerはなく、gemをハードな方法でインストールする必要がありました。 Railsでは、これはrake gems:installを実行することを意味しました コマンドがエラーなしで渡されるまで、100万回、発生したバグを修正しました。今日は、宝石とは何か、そしてそれらがどのように機能するかを調べた後、昔ながらの方法で宝石を作成します。

宝石、それらは何ですか?

RubyGemsは、他の人が書いた機能を使って独自のコードを拡張する簡単な方法です。たとえば、独自の認証/認証コードを作成する代わりに、Deviseを使用できます。アップロードした画像のサイズを変更する場合は、CarrierWaveを使用できます。これにより、他の人と共有できる再利用可能なコードを作成できます。

しかし、それらはどのように機能しますか?

最も基本的な形式では、gemはコードと<name>.gemspecを含むzip形式のディレクトリにすぎません。 ファイル。この.gemspec fileには、名前、ロードするファイル、依存関係など、gemに関するメタデータが含まれています。

gem install またはbundle コマンドは、ソースからzipファイルをダウンロードし、ハードドライブに抽出します。 bundle info <gem name>を実行すると、gemがどこにあるかを知ることができます。 または、bundle open <gem name>を実行して、gemディレクトリを直接開きます。 。

宝石をアプリケーションにロードするために、Rubygemsはrequireにモンキーパッチを適用します Kernelの関数 クラス。最初にディスクからファイルを読み取ろうとしますが、それが機能しない場合は、システム上の各gemのファイルを解決しようとします。 gemでファイルが見つかると、ロードパスに追加してgemを「アクティブ化」します。

Bundlerを使用する場合、setup中に特定の各gemがロードパスに追加されます 電話。これにより、Rubygemsがパスを解決しようとする手間が省けます。また、RubyがGemfile(.lock)で選択されているものとは異なるバージョンのgemをロードするのを防ぎます。

どうすれば作成できますか?

独自のgemを作成する最も簡単な方法は、Bundlerを使用してgemスキャフォールドを生成することです。これには、適切なディレクトリ構造、ライセンス、行動規範、およびgemのテスト環境が含まれます。

ただし、今日は、コードとgemspecを含む2つのファイルだけで独自のミニマルなgemを作成します。 メタデータを含むファイル。私たちの宝石は、呼び出されるとユーザーに挨拶します。まず、gemのディレクトリを作成します。

mkdir howdy
cd howdy

このディレクトリに、libを作成します コードとhowdy.gemspecを含むフォルダー メタデータを含むファイル。次のようになります:

tree
.
├── howdy.gemspec
└── lib
    └── howdy.rb

私たちのハウディジェムには次のコードがあります:

lib / howdy.rb

class Howdy
  def greet
    "howdy!"
  end
end

ミニマルなhowdy.gemspec fileには、バージョン、作成者などに関する情報が含まれています。また、gemをビルドするときに保持するファイルも指定します。これにより、gemのユーザーは、gemコードの実行に必要のないテストやその他のファイルなどの不要なファイルをダウンロードする必要がなくなります。

Gem::Specification.new do |spec|
  spec.name          = "howdy"
  spec.version       = "0.0.1"
  spec.authors       = ["Robert Beekman"]
  spec.email         = ["robert@example.com"]
 
  spec.summary       = %(Greets the user)
  spec.description   = %(Howdy is a gem that greets the user when called)
  spec.license       = "MIT"
 
  spec.files         = ["lib/howdy.rb"]
end

gemをビルドするには、gem build howdy.gemspecを使用できます。 指図。 howdy-0.0.1.gemを生成します コードを含むファイル。 gemを他の人が利用できるようにするには、gem publishを使用してrubygems.orgに公開します。 コマンド。

要約

これらは、非常に基本的なgemを作成して公開するために必要な手順です。宝石の考古学と昔ながらの宝石の作り方を楽しんでいただけたでしょうか。前に述べたように、これは教育目的でした。 Bundlerを使用して、今日の世界で宝石の足場を生成することをお勧めします。

平和、若者たち!ご意見、ご質問、ご意見がございましたら、お気軽にお問い合わせください。


  1. VCRGemを使用してテストスイートを改善する方法

    Rubyアプリケーションが何らかの外部APIを使用している場合は、おそらくテストとAPIレートの制限が遅いという問題に直面している可能性があります。 。 解決策は何ですか? クライアントライブラリからHTTPメソッドを手動でスタブし、事前に決定された応答を返すことができます。 しかし、それは多くの作業と醜いコードです! より良い解決策は、 Webmock+VCRのような宝石の強力な組み合わせを使用することです。 。 WebMockは、次のような一般的なHTTPライブラリからのHTTPリクエストをインターセプトします。 net / http ファラデー RestClient

  2. AASMGemを使用してRubyでステートマシンを作成する方法

    今日は、ステートマシン、それらがどのように機能するか、AASMgemを使用したRubyプロジェクトでそれらを使用する方法について学習します。 今 : 信号機を想像してみてください… 赤、緑、黄色のいずれでもかまいません。 色が変わると、次へ 色は現在に基づいています 1つ。 これは、目の不自由な人がいつ横断できるかを知るための音を出す種類だとしましょう。 今 : あなたはこのためのソフトウェアを書いています。 毎回再生する音と次の色をどのように知るのですか? 次のようなifステートメントを記述できます: if @light.state == green @ligh