いいえ。これはバンドラーの問題のようです。このコードは、レールへの依存関係を宣言するだけです。音がおかしい?これが私が起こっていると思うことです。
通常の方法は、.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
ます。