出于好奇......在我之前的帖子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_dependency
和add_development_dependency
告诉gem,哪些宝石用于生产以及哪些用于开发模式,所以我看不出test/dummy
没有做任何理由此
所以这是最后一个问题:我究竟要在哪里告诉Ruby在我的test/dummy
应用中使用gem?我不想强迫RUBY在主机APP中使用GEM。
答案 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中指定它,否则它将无法工作。还是有点混乱,这个东西......