Rails 3.1引擎:my_engine.gemspec,add_dependency,add_development_dependency和Gemfile的区别

时间:2012-09-20 09:21:31

标签: ruby-on-rails gem rails-engines gemfile

出于好奇......在我之前的帖子Rails3.1 engine: can't get SLIM or HAML to work in test/dummy app中,我问过哪里告诉Ruby在我的test/dummy应用程序中使用一些gem。

(显而易见的?)答案是将它放入我的引擎的Gemfile中。这有效,但这让我有点不舒服,因为在Yehuda Katz的帖子中Clarifying the Roles of the .gemspec and Gemfile他提到了......

  

...在开发gem时,Gemfile“gem的Gemfile应包含Rubygems源和单个gemspec行”。

另一方面,在我的Engine的Gemfile(使用Rails'rails plugin new my_engine生成)中,有:

# jquery-rails is used by the dummy application
gem "jquery-rails"

所以这似乎是正确的。 更新:不,它没有!请看下面的答案......

仍然,somewhere else on StackOverflow我认为这个解决方案只需要config/application.rb中所需的宝石,而https://stackoverflow.com/questions/5159607/rails-engine-gems-依赖关系 - 如何将它们加载到应用程序中,它被告知最好放入lib/<your_engine>/engine.rb file

以下是我的想法:为什么test/dummy应用只是自动要求.gemspec文件中指定的所有Gems?我们甚至通过明确使用add_dependencyadd_development_dependency告诉gem,哪些宝石用于生产以及哪些用于开发模式,所以我看不出test/dummy没有做任何理由此

所以这是最后一个问题:我究竟要在哪里告诉Ruby在我的test/dummy应用中使用gem?我不想强迫RUBY在主机APP中使用GEM。

2 个答案:

答案 0 :(得分:5)

我认为正确的方法如下:

引擎是一个普通的宝石。在开发gem时,将其依赖项放在gemspec文件中。如果您使用bundle,那么作为开发人员,您可以创建一个.lock文件,其中包含您没有遇到任何问题的特定版本。但是在gemspec中声明的依赖关系不足以使用它们,您必须在gem代码中require。当需要它们时,如果gem与bundle一起使用,则使用.lock版本。

在引擎中,与任何其他宝石一样,它也是一样的。您可以在gemspec文件中定义依赖项,然后运行bundle install,但仅使用它们是不够的。例如,您必须在lib/my_engine.rb

中要求它们

例如:

# File: my_engine.rspec
# ...
s.add_dependency `slim_rails`, ' ~>1.0'

#...

# File: lib/my_engine.rb
require "my_engine/engine"
require "slim-rails"

module MyEngine
end

如果设置在Gemfile中,我不确定如何使用它们而没有更多麻烦,但rails documentation说:

  

引擎内的Gem依赖项应该在   .gemspec文件位于引擎的根目录下。原因是发动机   可以作为宝石安装。如果要在里面指定依赖项   Gemfile,传统的gem不会识别它们   安装,所以他们不会安装,导致引擎   故障。

答案 1 :(得分:2)

这是我到目前为止所发现的。

在引擎中(使用rails plugin new my_engine创建),您必须在my_engine.gemspec文件中指定所需的gems ,然后使用test / dummy / Gemfile引用它们gemspec

这是生成的test / dummy / Gemfile内容:

source "http://rubygems.org"

# Declare your gem's dependencies in simple_view_helpers.gemspec.
# Bundler will treat runtime dependencies like base dependencies, and
# development dependencies will be added by default to the :development group.
gemspec

# jquery-rails is used by the dummy application
gem "jquery-rails"

# Declare any dependencies that are still in development here instead of in
# your gemspec. These might include edge Rails or gems from your path or
# Git. Remember to move these dependencies to your gemspec before releasing
# your gem to rubygems.org.

# To use debugger
# gem 'debugger'

gem "jquery-rails"行在这里做了什么我真的不知道,似乎完全与评论中提出的内容相矛盾。另一方面,当我尝试在我的测试/虚拟应用程序中使用SLIM gem(而不是ERB)时,似乎我必须在Gemfile中指定它,否则它将无法工作。还是有点混乱,这个东西......