【问题标题】:Jade include produces error when trying to include a file in parent folder sibling尝试在父文件夹兄弟中包含文件时,Jade include 会产生错误
【发布时间】:2015-09-07 12:29:14
【问题描述】:

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

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

这会产生错误

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

注意'jade'的双重实例。

文件夹结构是这样的:

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

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

include ../jade/includes/head

这是一个相当标准的 WSK 项目(使用 Gulp),使用 gulp-accord 编译 Jade。请参阅下面 gulp 文件中的 sn-p:

// 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

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

【问题讨论】:

  • 你确定你没有[project home]/app/jade/layout.jade 的玉文件或者没有清理的东西吗?也许它被复制而不是移动到layouts 文件夹中?
  • 您可能应该更改您的 gulp 任务以仅接收来自 app/jade/layouts/*.jade 的文件。没有理由编译其他任何东西,对吧?
  • 好吧,布局并不是真正的 html 页面,它们被例如 app/jade/jade-test.jade 使用,如下所示:extends /jade/layouts/article-layout.jade 来获取jade-test.html服务的根目录(.tmp 或 dist)。
  • 你的评论让我思考,不过。似乎问题在于布局文件被编译了两次;一次是独立的,一次是作为扩展它的玉文件的一部分。 include 似乎将代码粘贴到其中,然后解析任何扩展(可能包括),这意味着我们有不同的上下文。

标签: node.js gulp pug


【解决方案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

【讨论】:

    【解决方案2】:

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

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

    include ./../includes/head
    

    【讨论】:

    • 对不起,我也应该把这个例子也放进去,因为这不知何故给了我错误“ENOENT,没有这样的文件或目录'[project home]/app/includes/head.玉”。这就是让“玉”的双重展示更加混乱的原因。进行编辑。
    • 能否请您发布您的 gulpfile 玉器编译片段?
    • 按要求;检查代码片段的问题。
    • 我目前的理论是不管有没有jade/都会出现问题,因为layout.jade文件被编译了两次;一次作为扩展它的文件的一部分,一次单独。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-27
    • 2019-12-27
    • 2016-04-09
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多