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

レールは宝石をどのように処理しますか?

数週間前、RubyGemsがRubyのロードパスを管理する方法について書きました。ただし、RailsはRubyGemsを直接使用せず、Bundlerを使用してgemを管理します。

Bundlerがどのように機能するかわからない場合、宝石がRailsに引き込まれる方法は少しに思えるかもしれません。 魔法の。 Gemfileに行を追加するにはどうすればよいですか アプリにコードを入れますか? Bundler、Rails、RubyGemsがどのように連携して、依存関係の処理を容易にしますか?

なぜBundlerなのか?

Bundlerは厳密な宝石マネージャーだと思います。つまり、 Bundlerは、必要なgemの適切なバージョンをインストールするのに役立ち、アプリをのみに強制します。 それらのバージョンを使用してください。

これは本当に役に立ちます。理由を理解するには、Bundlerの前に世界に戻らなければなりません。

Bundlerが登場する前は、ある種のセットアップスクリプトを使用して、適切なバージョンのgemをインストールするのは非常に簡単でした。

bin / setup
gem install rails -v 4.1.0
gem install rake -v 10.3.2
...

(つまり、Rails4.1の依存関係がRake10.3.2の依存関係と競合しない限り!)

しかし、それぞれが異なるバージョンのgemに依存する、いくつかの異なるRailsアプリで作業している場合はどうなりますか? 本当に注意しないと、ひどい宝石アクティベーションエラーが発生します:

gem_error
Gem::Exception: can't activate hpricot (= 0.6.161, runtime), 
already activated hpricot-0.8.3

うーん。そのメッセージはまだ私に悪夢を与えます。これは通常、gemのインストールとアンインストールを1日行うことを意味するため、だけ取得できます。 そのマシンの適切なバージョン。そして、必要なのは偶発的なgem install rake 注意深い計画をすべて完全に台無しにする。

rvm gemsetsは、しばらくの間この問題を解決しました。ただし、セットアップには時間がかかり、誤って間違ったgemsetにインストールした場合は、同じ問題に戻ります。 Bundlerを使用すると、依存関係について考える必要はほとんどありません。通常、アプリは正常に機能します。 また、Bundlerはgemsetよりもはるかに少ないセットアップで済みます。

したがって、Bundlerは2つの重要なことを行います。必要なすべてのgemをインストールし、RubyGemsをロックダウンするため、これらのgemはのみ そのRailsアプリ内で必要なもの。

RailsはBundlerをどのように使用しますか?

基本的に、Bundlerはgemをインストールして分離します。しかし、それだけではありません。 Gemfileのgemからのコードはどのようになりますか Railsアプリにしますか?

bin/railsを見ると :

bin / rails
#!/usr/bin/env ruby
begin
  load File.expand_path("../spring", __FILE__)
rescue LoadError
end
APP_PATH = File.expand_path('../../config/application',  __FILE__)
require_relative '../config/boot'
require 'rails/commands'

../config/bootを要求すると、Railsが読み込まれることがわかります。 。そのファイルを見てみましょう:

config / boot
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)

require 'bundler/setup' # Set up gems listed in the Gemfile.

ねえ、それはバンドラーです! (また、別のGemfileを選択できることを学びました 環境変数BUNDLE_GEMFILEを設定して使用します 。とてもかっこいいです。)

bundler/setup いくつかのことを行います:

  • $LOAD_PATHからgemへのすべてのパスを削除します (これにより、RubyGemsが行ったロードパスの作業が逆になります。)
  • 次に、 Gemfile.lock内のgemのみのロードパスを追加します $LOAD_PATHに戻る 。

現在、requireできる唯一の宝石 からのファイルは、Gemfileにあるファイルです。 。

したがって、必要なすべての宝石はロードパス上にあります。ただし、RubyGemsを単独で使用する場合でも、requireする必要があります。 必要なファイル。 BundlerでRailsを使用するときに、宝石を要求する必要がないのはなぜですか?

config/application.rbをざっと見てください 、Railsの起動後に実行されます:

config / application.rb
# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(*Rails.groups)

再びバンドラーです! Bundler.require 渡すすべてのグループのすべての宝石が必要です。 (「グループ」とは、Gemfileで指定するグループを意味します。)

Rails.groupsに含まれるグループ 、でも?

railties / lib / rails.rb
   # Returns all rails groups for loading based on:
    #
    # * The Rails environment;
    # * The environment variable RAILS_GROUPS;
    # * The optional envs given as argument and the hash with group dependencies;
    #
    #   groups assets: [:development, :test]
    #
    #   # Returns
    #   # => [:default, :development, :assets] for Rails.env == "development"
    #   # => [:default, :production]           for Rails.env == "production"
    def groups(*groups)
      hash = groups.extract_options!
      env = Rails.env
      groups.unshift(:default, env)
      groups.concat ENV["RAILS_GROUPS"].to_s.split(",")
      groups.concat hash.map { |k, v| k if v.map(&:to_s).include?(env) }
      groups.compact!
      groups.uniq!
      groups
    end

まあ、それはそれを説明しています。 Rails.groups [:default, :development]になります Railsを開発モードで実行している場合、[:default, :production] 本番モードなどで。

したがって、BundlerはGemfileを調べます これらの各グループに属するgemの場合は、requireを呼び出します。 それが見つけた宝石のそれぞれに。 宝石をお持ちの場合nokogirirequire "nokogiri"と呼ばれます あなたのために。 そのため、通常、gemはRailsで機能し、追加のコードは必要ありません。

ツールを知る

使用しているツールをよく理解していれば、それらを使用する方が簡単です。したがって、常に何かを使用していることに気付いた場合は、もう少し掘り下げるのに数分かかる価値があります。

RubyとRailsで作業している場合は、毎日宝石を使用します。時間をかけてよく学んでください!


  1. RailsでFlashメッセージを使用する方法

    フラッシュメッセージとは何ですか? フラッシュメッセージは、Railsアプリケーションのユーザーと情報を伝達する方法であり、ユーザーはアクションの結果として何が起こるかを知ることができます。 メッセージの例 : 「パスワードが正しく変更されました」(確認) 「ユーザーが見つかりません」(エラー) これらのフラッシュメッセージをコントローラーに設定してから、ビューにレンダリングします。その後、ユーザーはそれに応じて行動できます。 これがどのように機能するかを正確に学びましょう! フラッシュメッセージの使用方法 flashを使用して、これらの通知メッセージを操作できます ヘルパーメソ

  2. RailsアプリケーションでOmniAuth-Twitterを使用する方法

    このチュートリアルでは、アプリケーションのユーザーがTwitterアカウントを使用してログインできるようにする方法を学習します。これを行うには、OAuthなどのツールを使用すると簡単になります。 OmniAuthのTwitter戦略を含むOmniAuth-Twitterを利用します。 飛び込みましょう! はじめに Railsアプリケーションを生成することから始めます。ターミナルから、コマンドを実行して実行します。 rails new Tuts-Social -T Gemfileを開き、ブートストラップgemを追加します。 #Gemfile...gem bootstra