使用 guard 渲染一个相对的 haml

Render a relative haml using guard

我的文件结构如下所示:

Guardfile

resolution1/menu/page1.haml

resolution1/menu/some_partial.haml

resolution2/...

resolution3/...

现在,在 page1.haml 中,我有一条线可以在其中呈现部分 haml(我没有使用 Rails)

= Haml::Engine.new(File.read("./some_partial.haml")).render

它失败了:

Error: No such file or directory @ rb_sysopen - ./some_partial.haml

因为我的工作目录是 Guardfile 所在的目录。应该工作的解决方法是:

= Haml::Engine.new(File.read("#{__dir__}/some_partial.haml")).render

或者如果我感到绝望,即使这样(获取文件绝对路径)

= Haml::Engine.new(File.read("#{File.expand_path(File.dirname(__FILE__))}/some_partial.haml")).render

但是,这并没有像我希望的那样工作。

File.expand_path(File.dirname(__FILE__))

它没有给我文件的绝对路径(不考虑工作目录),而是给我工作目录的绝对路径。

当然,我可以设置可行的路径,但我不想在每次渲染中都包含我的目标分辨率。

我的Guardfile

guard :haml, output: '../package/www' do
  watch(/^.+(\.haml)$/)
end

我正在使用 Windows,该死的我的生活。有什么建议么?我只需要从同一目录中的文件中获取文件。

这是由 Guard::Haml 处理模板的方式造成的。 It (currently) does this:

content = File.new(file).read
engine  = ::Haml::Engine.new(content, (options[:haml_options] || {}))

它将模板读入一个字符串,然后将该字符串传递给 Haml。这意味着当 Haml 看到该字符串时,它无法知道它应该与哪个文件相关联。

Haml 有一个 :filename option 允许您将文件名传递给 Haml。这允许 __FILE____dir__ 正常工作,但 Guard::Haml 目前不使用它。

我创建了一个 pull request that adds this feature。如果你想在合并之前试用该代码并制作一个新版本(假设它被接受),你可以使用我的 repo 上的分支。为此,请将 Gemfile 更改为:

gem 'guard-haml', :github => "mattwildig/guard-haml", :branch => 'filename_option'

(我认为还值得指出的是,如果其中一个“子”模板发生更改,此设置不会自动重建“父”文件)。