0

在浏览active-admin代码时,我发现Gemfile包含rails条目。

rails_version = detect_rails_version
gem 'rails', rails_version

这是否意味着active-admin在内部创建了一个不是主要 rails 应用程序的 rails 服务器?

如果Yes,这会导致性能问题,并且将它与复杂的 Rails 应用程序一起使用是一种不好的做法吗?

如果,它在 active-admin Gemfile 中的用途是什么?

谷歌搜索了很多不同的关键字,这些关键字只会导致 gem 安装和相关结果。

如果有人提出一些见解,我会很高兴。谢谢 :)

update1: ​​在 Gaurish 回答和谷歌搜索之后,似乎 gem 中的 Gemfile 用于在内部列出 gem 所需的依赖项。但它产生了另一个问题,当应用程序 gem 和 gem 的 gem 冲突时会发生什么?

update2: 我们可以独立使用 active-admin,因为它有 rails 作为依赖项吗?(只需安装 active-admin,gem install active-admin而不是将其保存在其他 Rails 应用程序中。)

4

1 回答 1

1

不,这似乎是一个捆绑程序问题。这段代码只是声明了对 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.1v3.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

于 2013-08-31T17:52:37.917 回答