Jade include 在尝试将文件包含在父文件夹兄弟中时产生错误

Jade include produces error when trying to include a file in parent folder sibling

所以我的 layout.jade 文件顶部有这段 Jade 代码:

doctype html
  html
    head
      include ./../jade/includes/head

这会产生错误

ENOENT, no such file or directory '[project root]/jade/jade/includes/head.jade'

注意 'jade' 的双重实例。

文件夹结构是这样的:

[project home]
  app/
    jade/
      layouts/
        layout.jade
      includes/
        head.jade

顺便说一句,这会产生相同的错误:

include ../jade/includes/head

这是相当标准的WSK project (which uses Gulp), compiling the Jade using gulp-accord。请参阅下面 gulp 文件的片段:

// Compile Jade files.
gulp.task('jade', function () {

  return gulp.src('app/jade/**/*.jade')
    .pipe($.accord('jade', { pretty: true }))
    .pipe(gulp.dest('.tmp'))
    .pipe(gulp.dest('dist'));

});

我通过在 gulp 文件中指定 'basedir' ("app/") 作为 gulp-accord 的选项并使用它来解决这个问题:

include /jade/includes/head

也许这是更好的做法,但我仍然想知道为什么会出现错误。

编辑:

为此苦苦思索了一段时间,我错过了一个非常重要的部分,那就是:

include ./../includes/head

它抛出错误:

ENOENT, no such file or directory '[project home]/app/includes/head.jade

所以,如果你这样做,那该死,如果你不这样做,那该死...

您包含的路径将相对于当前文件的目录 /app/jade/layouts - layout.jade。这就是为什么您只需要向上遍历目录树 (../) 一次就可以到达 /app/jade 目录。从这里您试图再次进入 jade 目录 (jade/),该目录不存在(/app/jade/jade 不存在)。而是直接转到 includes/head.

下面的包含代码应该可以正常工作:

include ./../includes/head

通过进一步测试,问题在于布局是单独呈现的,以及在其他文件中通过 extends 使用时呈现的。证据是根据路径为不同的文件抛出错误:一个是 jade/jade/,另一个是当退出一步到编辑中出现的最远时。

结构中其他文件的路径需要在这两种情况下都存在,即通过使用绝对路径(如 include /jade/includes/head)和 gulpfile 中设置的 basedir 选项([= 的值26=],在我的特定 WSK 案例中)。或者您需要通过将部分和布局从 gulp.src() 中排除来确保它们不会被编译。如果我的文件夹结构是这样的:

gulp.task('jade', function () {
  return gulp.src(['app/jade/**/*.jade', 
                   '!app/jade/layouts{,/**}', 
                   '!app/jade/includes{,/**}'])
    .pipe($.accord('jade', { pretty: true, basedir: "app" }))
    .pipe(gulp.dest('.tmp'))
    .pipe(gulp.dest('dist'));
});

使用 basedir 和绝对路径,您不必担心将来会添加更多文件夹。但是您可能不想将布局和部分编译为 HTML,那么为什么不两者都做呢?

关于排除的一个很好的演练是 here