0

active-adminコードを参照しているときに、 Gemfilerailsエントリが含まれていることがわかりました。

rails_version = detect_rails_version
gem 'rails', rails_version

それは、active-adminがメインの Rails アプリではない Rails サーバーを内部的に作成するということですか?

はいの場合、それはパフォーマンスの問題につながりますか?複雑な Rails アプリケーションで使用することは悪い習慣ですか?

Noの場合、active-admin Gemfile での使用は何ですか?

宝石のインストールと関連する結果のみにつながるさまざまなキーワードで多くのグーグル検索。

誰かが洞察を入れてくれたらうれしいです。ありがとう :)

update1: Gaurish の回答とグーグルの後、gem 内の Gemfile を使用して、gem に必要な依存関係を内部的にリストしているようです。しかし、別の疑問が生じます。アプリケーションの gem と gem の gem が競合するとどうなるでしょうか?

update2: 依存関係としてレールがあるため、active-admin スタンドアロンを使用できますか? gem install active-admin(他の Rails アプリケーションに保持する代わりに、active-admin をインストールするだけです。)

4

1 に答える 1

1

いいえ。これはバンドラーの問題のようです。このコードは、レールへの依存関係を宣言するだけです。音がおかしい?これが私が起こっていると思うことです。

通常の方法は、.gemspec次の行を使用してファイルで依存関係を宣言することです。

s.add_dependency("rails", ">= 3.0.0")

上記の行は、rails v3.0& above( v3.1, v3.2) への依存関係を追加します。現在、これは他のgemで正常に機能し、バンドラーは依存関係を自動解決します。しかし、複数のバージョンの Rails をサポートしようとすると、bundler が混乱する可能性があります。

理想的には、バンドラーは、gem のすべての依存関係を自動的にバンドル (インストール) できる必要があります。また、gem 依存関係の依存関係。v3.1たとえば、bundle は railsまたはv3.2が必要かどうかを判断できるほどスマートである必要があります。またsass-rails、Rails 3.1 および 3.2 で必要とされる & 'uglifier' も含める必要があります。ただし、レールv3.0が必要な場合は、何もする必要はありません。

しかし、私たちはそれほど完璧ではない世界に住んでいるので、バンドラーは十分に賢くありません。active-adminしたがって、これがバンドラーの欠点に関する次のハックに頼らなければならない理由だと思います。

unless defined?(RAILS_VERSION_FILE)
  RAILS_VERSION_FILE = File.expand_path("../../../.rails-version", __FILE__)
end

unless defined?(DEFAULT_RAILS_VERSION)
  DEFAULT_RAILS_VERSION = "3.1.0"
end

def detect_rails_version
  return DEFAULT_RAILS_VERSION unless File.exists?(RAILS_VERSION_FILE)
  File.read(RAILS_VERSION_FILE).chomp
end

def write_rails_version(version)
  File.open(RAILS_VERSION_FILE, "w+"){|f| f << version }
end


rails_version = detect_rails_version
gem 'rails', rails_version

case rails_version
when /^3\.0/
  # Do nothing, bundler should figure it out
when /^3\.(1|2)/
  # These are the gems you have to have for Rails 3.1 to be happy
  gem 'sass-rails'
  gem 'uglifier'
else
  raise "Rails #{rails_version} is not supported yet"
end

上記のコードに気付いた場合、レールの現在のバージョンが v3.1 か v3.2 かをチェックします。はいの場合は、依存関係として新しい 2 つを追加します。このコードが行うことはそれだけです。


[アップデート]

質問 1.アプリケーションの gem と gem の gem が競合するとどうなりますか? アプリと gem の依存関係を満たす互換性のあるバージョンをバンドラーが見つけられないような方法でそれらが競合する場合。bundler は次のようなエラーで失敗します。

Bundler could not find compatible versions for gem "json":
  In Gemfile:
    chef (~> 10.26) ruby depends on
      json (<= 1.7.7, >= 1.4.4) ruby

    berkshelf (~> 2.0) ruby depends on
      json (1.8.0)

質問 2. Rails なしでactive-admin スタンドアロンを使用できますか? いいえ、そうすると、ファイル内gem install active-adminのこのgemの依存関係としてリストされているように、rubygemsはレールを自動インストールしgemspecます。

于 2013-08-31T17:52:37.917 に答える