8

我正在开发一个 Rails3 引擎应用程序,我想使用 Haml 作为视图。

首先,我所做的是将其添加到引擎 Gemfile 中:

gem "haml"

当我测试我的引擎时,它工作正常(我使用https://github.com/josevalim/enginex生成 gem 并使用虚拟应用程序对其进行测试)。

当我尝试在真正的 Rails 应用程序上使用引擎时,我的问题就开始了。该应用程序在它自己的 Gemfile 上没有 gem“haml”,因此它没有初始化 Haml,所以我收到模板未找到错误,因为它不是在寻找 .haml 视图。我在想,通过在引擎上需要 Haml,Rails 应用程序也需要它就足够了。

我现在所做的是使用以下代码在引擎上添加 config/initializers/haml.rb:

require 'haml'
Haml.init_rails(binding)

它现在正在工作,但我想知道这是否真的是一个好方法。为什么 Rails 没有调用 Haml “init.rb” 文件,而是通过将 gem “haml” 添加到引擎 Gemfile 来正确初始化 Haml?

4

2 回答 2

20

有两件事是必要的。首先,在 .gemspec 中:

s.add_dependency 'haml', ['>= 3.0.0']

在你的 lib/gem_name.rb 中:

require 'haml'

然后bundle在 gem 和 app 目录中运行。

于 2011-08-04T09:05:29.380 回答
6

我认为您必须将 haml 作为依赖项放入引擎 gemspec 中,以便捆绑程序将 haml 安装在目标应用程序中(并显示在其 Gemfile.lock 中)。像这样的东西:

Gem::Specification.new do |s|
  s.add_dependency(%q<haml>, [">= 0"])
end

我刚刚在我的一个引擎上进行了测试。如果没有 .gemspec 中的依赖项,它不会在目标应用程序中安装 haml(没有出现在 Gemfile.lock 中)。在我将 haml 作为依赖项添加到 gemspec 之后,它确实出现了:

PATH
  remote: /rails_plugins/mine/my_engine
  specs:
    my_engine (0.0.0)
      formtastic
      haml
      inherited_resources
      settingslogic
      sqlite3-ruby

GEM
  remote: http://rubygems.org/
  specs:
    #................
    haml (3.0.25)
    #................

如果您使用珠宝商,它会根据您的 Gemfile 中的内容自动将依赖项添加到 gemspec 中。如果您在 Gemfile 中定义了组,它甚至会添加一个 development_dependency。我只是简单地看了一下enginex,所以我不知道它是否有类似的rake任务来构建gemspec。

这可能有助于澄清一些事情:

http://yehudakatz.com/2010/12/16/clarifying-the-roles-of-the-gemspec-and-gemfile/

于 2011-02-16T13:45:19.653 回答