没有。这似乎是一个捆绑程序问题。 this code 只是声明了对 rails 的依赖。声音很奇怪?这就是我认为正在发生的事情。
通常的方法是使用以下行在.gemspec 文件中声明您的依赖项:
s.add_dependency("rails", ">= 3.0.0")
以上几行添加了对 rails v3.0 & above(v3.1,v3.2) 的依赖。现在这适用于其他 gem & bundler 将自动解决依赖关系。但是当您尝试支持多个版本的 rails 时,bundler 可能会感到困惑。
理想情况下,bundler 应该能够自动捆绑(安装)我们 gem 的所有依赖项。还有 gem 依赖的依赖。例如,bundle 应该足够聪明,可以判断是否需要 rails v3.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。我们可以单独使用 active-admin 吗
没有铁轨?不,当您执行gem install active-admin 时,rubygems 将自动安装 rails,因为它在 gemspec 文件中列为此 gem 的依赖项。