不,这似乎是一个捆绑程序问题。这段代码只是声明了对 Rails 的依赖。声音很奇怪?这就是我认为正在发生的事情。
通常的方法是.gemspec
使用以下行在文件中声明您的依赖项:
s.add_dependency("rails", ">= 3.0.0")
v3.0
上面的行增加了对 rails & above( v3.1
, v3.2
)的依赖。现在这适用于其他 gem & bundler 将自动解决依赖关系。但是当您尝试支持多个版本的 rails 时,bundler 可能会感到困惑。
理想情况下,bundler 应该能够自动捆绑(安装)我们 gem 的所有依赖项。还有 gem 依赖的依赖。例如,bundle 应该足够聪明,可以确定是否需要 railsv3.1
或v3.2
,它还需要包含sass-rails
& 'uglifier',因为它们是 rails 3.1 和 3.2 所要求的。但是,如果需要 rails v3.0
,则无需做任何额外的事情。
但是我们生活在一个不太完美的世界里,所以 bundler 不够聪明。因此,我认为这就是active-admin
必须对 bundler 的缺点采取以下技巧的原因。
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
如果您注意到上面的代码,它会检查当前版本的 rails 是 v3.1 还是 v3.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 吗?不,当您这样做时,rubygems 将自动安装 rails,因为它在文件gem install active-admin
中列为此 gem 的依赖项。gemspec