在浏览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应用程序中。)
答案 0 :(得分:1)
没有。这似乎是一个捆绑问题。 this code只是声明对rails的依赖。声音很奇怪?这就是我认为正在发生的事情。
通常的方法是使用以下行在.gemspec
文件中声明您的依赖项:
s.add_dependency("rails", ">= 3.0.0")
上述行添加了对rails v3.0
&的依赖性。上述(v3.1
,v3.2
)。现在这适用于其他宝石& bundler将自动解析依赖项。但是当你尝试支持多个版本的rails时,bundler可能会感到困惑。
理想情况下,bundler应该能够自动捆绑(安装)gem的所有依赖项。以及gem依赖关系的依赖关系。例如,bundle应该足够聪明,以确定是否需要rails v3.1
或v3.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的依赖项。