出于好奇..。在我之前的帖子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中他提到了……
...when正在开发一个gem,gem文件“gem的gem文件应该包含Rubygems源代码和一个gemspec行”。
另一方面,在我的引擎的Gemfile (使用Rails的rails plugin new my_engine
生成)中有:
# jquery-rails is used by the dummy application
gem "jquery-rails"
因此,这似乎是正确的。更新:不,它不是!请看我下面的回答...
尽管如此,我认为这个问题的解决方案据说只需要在config/application.rb
中使用所需的gem,而https://stackoverflow.com/questions/5159607/rails-engine-gems-dependencies-how-to-load-them-into-the-application则被告知最好将其放到lib/<your_engine>/engine.rb file
中。
我的想法是:为什么test/dummy
应用程序不简单地自动要求.gemspec
文件中指定的所有Gems?我们甚至通过显式地使用add_dependency
和add_development_dependency
来告诉gem,哪个gem用于生产,哪个gem用于开发模式,所以我看不出test/dummy
不这样做的任何理由。
所以这里是最后一个问题:我到底应该在哪里告诉Ruby在我的test/dummy
应用程序中使用gem?我不想强迫RUBY在主机应用程序中也使用GEM。
发布于 2012-09-27 21:41:56
这是我到目前为止所发现的。
在引擎(使用rails plugin new my_engine
创建)中,您必须在my_engine.gemspec文件中指定所需的gem,因为随后会使用gemspec
从测试/虚拟/gem文件中引用它们。
下面是生成的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)时,似乎我do必须在gem文件中指定它,否则它将无法工作。还是有点迷惑,这些东西...
发布于 2013-07-27 18:43:36
我认为正确的做法是:
引擎是一颗普通的宝石。在开发gem时,您将其依赖项放在gemspec
文件中。如果您使用捆绑包,那么作为开发人员,您可以使用您没有遇到问题的特定版本来创建.lock
文件。但是在gemspec
中声明依赖项还不足以使用它们,您必须在gem代码中require
它们。当需要时,如果gem与捆绑包一起使用,则使用.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安装无法识别这些依赖项,因此无法安装这些依赖项,从而导致引擎发生故障。
发布于 2015-11-24 02:30:58
TL;DR:
在开发引擎时不要使用任何Gemfile
。将所有内容放在引擎的gemspec
中,让引擎本身需要它需要的所有内容。
为什么测试/虚拟应用程序不能简单地自动要求.gemspec文件中指定的所有Gem?
我猜,出于性能原因,应用程序不会自动需要其引擎的依赖项。
因此,如果虚拟应用程序被认为是使用引擎的真实应用程序的真实模拟,它也不应该这样做。
此外,假设虚拟应用程序将自动要求所有依赖项,包括开发依赖项。在这种情况下,即使您的一个开发依赖项实际上是运行时依赖项,您的测试也可能成功。这真的很烦人。
据说只是在config/application.rb中需要所需的gem
这也可能掩盖你的引擎的运行时依赖,所以最好不要这样做。
所以这是最后一个问题:我到底应该在哪里告诉
在我的测试/虚拟应用中使用gem?我不想强迫ruby在主机应用中也使用gem。
如果该gem仅用于测试,则需要在测试/规范帮助程序中使用它。
否则,如果你的引擎需要这个gem才能运行,你真的应该强制使用它。
James:这会让我相信引擎的依赖项会放在gemspec中,而虚拟应用程序的依赖项会放在Gemfile中
虚拟应用程序的捆绑程序存根实际上引用了虚拟应用程序自己的、缺少的Gemfile。所以我猜它是被故意遗漏的。这就说得通了。
这样想:你做的任何改变虚拟应用程序的事情都会导致测试不能在中立的背景下执行,因此不具有代表性。
如果您真的希望能够重用您的引擎,并将其放入任何空白的新Rails应用程序中,那么您的虚拟应用程序应该就是:一个空白的新Rails应用程序。
https://stackoverflow.com/questions/12509646
复制相似问题