Ruby on rails Rails 3.1引擎:my_engine.gempec、add_dependency、add_development_dependency和Gemfile的区别

Ruby on rails Rails 3.1引擎:my_engine.gempec、add_dependency、add_development_dependency和Gemfile的区别,ruby-on-rails,gem,rails-engines,gemfile,Ruby On Rails,Gem,Rails Engines,Gemfile,只是出于好奇。。。在我上一篇文章中,我问到在哪里告诉Ruby在我的test/dummy应用程序中使用一些gem 答案(很明显?)就是把它放进我引擎的GEM文件中。这是可行的,但这让我有点不舒服,因为在耶胡达·卡茨的帖子中,他提到 …在开发gem时,Gemfile“gem的Gemfile应该包含Rubygems源和单个gempec行” 另一方面,在我的引擎的GEM文件中(使用Rails'Rails插件new my_Engine)有: 所以这似乎是对的更新:不,没有!请看下面我的答案… 尽管如此,我

只是出于好奇。。。在我上一篇文章中,我问到在哪里告诉Ruby在我的
test/dummy
应用程序中使用一些gem

答案(很明显?)就是把它放进我引擎的GEM文件中。这是可行的,但这让我有点不舒服,因为在耶胡达·卡茨的帖子中,他提到

…在开发gem时,Gemfile“gem的Gemfile应该包含Rubygems源和单个gempec行”

另一方面,在我的引擎的GEM文件中(使用Rails'
Rails插件new my_Engine
)有:

所以这似乎是对的更新:不,没有!请看下面我的答案…

尽管如此,我认为解决方案据说只需要
config/application.rb
中所需的gem,而https://stackoverflow.com/questions/5159607/rails-engine-gems-dependencies-how-to-load-them-into-the-application 它被告知最好放在
lib//engine.rb文件中

我的想法是:
test/dummy
应用程序为什么不自动要求
.gempec
文件中指定的所有gem?我们甚至通过显式地使用
add_dependency
add_development_dependency
告诉gem,哪些gem用于生产,哪些gem用于开发模式,所以我看不出
test/dummy
为什么不这样做


最后一个问题是:我到底要告诉Ruby在我的
test/dummy
应用程序中使用gem到哪里?我不想强迫RUBY在主机应用程序中也使用GEM。

以下是我目前发现的情况

在一个引擎中(使用
rails plugin new my_engine
创建),您必须在my_engine.gempec文件中指定所需的gems,因为它们随后使用
gempec
从test/dummy/gempile引用

以下是生成的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“jqueryrails”这一行在这里做什么,它似乎与评论中提出的完全矛盾。另一方面,当我试图在测试/虚拟应用程序中使用gem(而不是ERB)时,似乎我必须在gem文件中指定它,否则它将不起作用。还是有点困惑,这些东西…

我认为正确的方法是:

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

在引擎中,就像其他宝石一样,它是一样的。您在
gempec
文件中定义了依赖项,并运行了
bundle安装
,但仅使用它们是不够的。例如,您必须在
lib/my_engine.rb
中要求它们

例如:

# File: my_engine.rspec
# ...
s.add_dependency `slim_rails`, ' ~>1.0'
# ... 如果在
Gemfile
中设置,我不确定为什么使用它们时不会出现更多问题,但如所述:

引擎内的Gem依赖项应在 .gempec文件位于引擎的根目录下。原因是引擎坏了 可以作为gem安装。如果要在内部指定依赖项 在Gemfile中,这些将不会被传统gem识别 安装后将无法安装,从而导致发动机损坏 故障


TL;医生:

开发引擎时不要使用任何
Gemfile
。将所有东西都放在引擎的
gempec
中,让引擎本身需要它所需要的一切


为什么test/dummy应用程序不自动要求.gempec文件中指定的所有gem

我猜应用程序不会出于性能原因自动要求其引擎的依赖项

因此,如果虚拟应用程序应该是使用引擎的真实应用程序的真实模拟,那么它也不应该这样做

另外,假设虚拟应用程序自动要求所有依赖项,包括开发依赖项。在这种情况下,即使某个开发依赖项实际上是运行时依赖项,测试也可能成功。那真的很烦人

据说它只需要config/application.rb中所需的gem

这也可能会屏蔽引擎的运行时依赖项,所以最好不要这样做

最后一个问题是:我到底要在哪里告诉Ruby在我的测试/虚拟应用程序中使用gem?我不想强迫ruby在主机应用程序中也使用gem

如果测试只需要这个gem,那么在test/spec助手中需要它

否则,如果您的引擎需要gem来运行,您真的应该强制执行它的用法

James:这会让我相信引擎的依赖项放在gempec中,而虚拟应用程序的依赖项放在gempec文件中

虚拟应用程序的绑定器存根实际上引用了虚拟应用程序自己的丢失文件。所以我想这是故意的。这很有道理

可以这样想:任何更改虚拟应用程序的操作都会导致测试无法在中性背景下执行,因此不具有代表性


如果你真的想重用你的引擎,把它放到任何一个空白的、新的Rails应用程序中,你的虚拟应用程序应该是:一个空白的、新的Rails应用程序。

+1;期待你得到的答案:-)用我目前的发现为问题添加了一些更有趣的信息(见更新)。感谢更新。愿意+1,但不能做两次;-)关于GEMG文件的事情
# 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