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

Jos*_*eim 17 gem ruby-on-rails rails-engines gemfile

出于好奇......在我以前的帖子Rails3.1引擎中:无法让SLIM或HAML在测试/虚拟应用程序中工作我问在哪里告诉Ruby在我的test/dummy应用程序中使用一些gem .

(显而易见的?)答案就是将它放入我的引擎的Gemfile中.这有效,但它让我有点不舒服,因为在耶胡达卡茨 '后澄清.gemspec和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"
Run Code Online (Sandbox Code Playgroud)

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

仍然,在StackOverflow上的其他地方我看到解决方案据说只需要所需的宝石config/application.rb,而/sf/ask/361172521/ -into-the-it它被告知要充分利用lib/<your_engine>/engine.rb file.

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

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

Wai*_*... 5

我认为正确的方法是:

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

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

例如:

# File: my_engine.rspec
# ...
s.add_dependency `slim_rails`, ' ~>1.0'
Run Code Online (Sandbox Code Playgroud)

#...

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

module MyEngine
end
Run Code Online (Sandbox Code Playgroud)

我不确定为什么它们会被使用而没有更多的麻烦如果设置在Gemfile,但正如rails文档所说:

应该在引擎根目录下的.gemspec文件中指定引擎内的Gem依赖项.原因是发动机可以作为宝石安装.如果要在Gemfile中指定依赖项,那么传统的gem安装将无法识别这些依赖项,因此不会安装它们,从而导致引擎出现故障.


Jos*_*eim 2

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

在引擎(使用 创建rails plugin new my_engine)中,您必须在 my_engine.gemspec 文件中指定所需的 gem,因为然后使用 来从 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'
Run Code Online (Sandbox Code Playgroud)

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

  • 奇怪的是,在较新版本的 Rails (3.2.11) 中,引擎的“Gemfile”位于根目录中,而测试虚拟应用程序没有。这会让我相信引擎的依赖项放在“gemspec”中,而虚拟应用程序的依赖项放在“Gemfile”中。 (6认同)