在gem中使用rails作为依赖

时间:2013-08-31 17:07:01

标签: ruby-on-rails gem activeadmin gemfile

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

rails_version = detect_rails_version
gem 'rails', rails_version

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

如果,是否会导致性能问题并将其与复杂的rails应用程序一起使用是不好的做法?

如果,它在active-admin Gemfile中有什么用?

使用不同的关键字搜索很多,这只会导致宝石安装和相关结果。

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

UPDATE1: 在Gaurish回答和googling之后,似乎gem中的Gemfile用于列出gem内部所需的依赖关系。 但它创造了另一个问题,当应用宝石和宝石的宝石结合时会发生什么?

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

1 个答案:

答案 0 :(得分:1)

没有。这似乎是一个捆绑问题。 this code只是声明对rails的依赖。声音很奇怪?这就是我认为正在发生的事情。

通常的方法是使用以下行在.gemspec文件中声明您的依赖项:

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

上述行添加了对rails v3.0&的依赖性。上述(v3.1v3.2)。现在这适用于其他宝石& bundler将自动解析依赖项。但是当你尝试支持多个版本的rails时,bundler可能会感到困惑。

理想情况下,bundler应该能够自动捆绑(安装)gem的所有依赖项。以及gem依赖关系的依赖关系。例如,bundle应该足够聪明,以确定是否需要rails v3.1v3.2,它还需要包括sass-rails& 'uglifier',因为他们需要rails 3.1& 3.2。但是如果需要rails 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

如果你注意到上面的代码,它会检查当前版本的rails是v3.1还是v3.2。如果是,则添加新的两个作为依赖项。这就是所有这些代码所做的。


[更新]

问题 1. 当应用程序宝石和宝石的宝石发生冲突时会发生什么? 如果它们发生冲突,捆绑器无法找到满足应用程序和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的依赖项。