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。
所以我的 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。