尝试在父文件夹兄弟

时间:2015-09-07 12:29:15

标签: node.js gulp pug

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

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

这会产生错误

  

ENOENT,没有这样的文件或目录'[项目   根] /jade/jade/includes/head.jade'

注意'jade'的双重实例。

文件夹结构如下:

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

BTW,这会产生同样的错误:

include ../jade/includes/head

这是一个相当标准的WSK项目(使用Gulp),使用gulp-accord编译Jade。请参阅下面的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'));

});

通过在gulpfile中指定'basedir'(“app /”)作为gulp-accord的选项并使用它来解决问题:

include /jade/includes/head

也许这只是更好的练习,但我仍然想知道错误发生的原因。

编辑:

我已经把头撞了一会儿,我错过了一个非常重要的部分,就是这个:

include ./../includes/head

它会引发错误:

  

ENOENT,没有这样的文件或目录'[project home] /app/includes/head.jade

如果你这样做,那就太该死了,如果你不这样做,该死的......

2 个答案:

答案 0 :(得分:1)

通过进一步测试,问题在于布局既可以单独呈现,也可以通过extends在其他文件中使用。证据在于,根据路径不同文件会引发错误:一个用于jade/jade/,另一个用于在编辑中退出一步到远的时候。

结构中其他文件的路径需要在这两个上下文中存活,即使用绝对路径(如include /jade/includes/head)并在gulpfile中设置basedir选项(值为“app”,在我特定的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

答案 1 :(得分:0)

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

下面的包含代码应该可以正常运行:

include ./../includes/head