(您没有查看官方的 gulp 文档。http://github.com/arvindr21/gulp 只是 gulpjs github 存储库的一些人的分支。官方存储库是 http://github.com/gulpjs/gulp/,其中 base option is indeed documented。)
回答你的问题:
如果您自己没有指定base 选项,那么gulp.src() 路径中第一个glob 之前的所有内容都会自动用作base 选项,并在写入目标文件夹时被省略。
假设你有以下文件:
some/path/example/app/js/app.js
some/path/example/vendor/js/vendor.js
some/path/example/vendor/lib/js/lib.js
这是你的 Gulpfile.js:
gulp.src('some/path/**/js/*.js')
.pipe(gulp.dest('output'));
在这种情况下,** 之前的所有内容都会自动用作您的base 选项。所以上面基本上等价于这个:
gulp.src('some/path/**/js/*.js', {base:'some/path/'})
.pipe(gulp.dest('output'));
这意味着some/path/ 被从与gulp.src() 中的模式匹配的每个文件的路径中删除。 output 文件夹中的结果结构如下所示:
output/example/app/js/app.js
output/example/vendor/js/vendor.js
output/example/vendor/lib/js/lib.js
因此,您的源文件目录结构的某些部分确实丢失了。您丢失了多少目录结构取决于gulp.src() 模式中的第一个 glob 的位置。
如果你想避免这种情况,你必须明确指定base 选项:
gulp.src('some/path/**/js/*.js', {base:'.'})
.pipe(gulp.dest('output'));
现在some/path/ 不会从您的文件路径中删除,从而导致output 中的以下文件夹结构:
output/some/path/example/app/js/app.js
output/some/path/example/vendor/js/vendor.js
output/some/path/example/vendor/lib/js/lib.js
编辑:如果将模式数组传递给gulp.src(),则无法为每个数组元素指定不同的base 选项。这例如 不会 工作:
gulp.src(
['source1/examples/**/*.html',
'source2/examples/**/*.html'],
{ base: ['source1/', // Doesn't work.
'source2/']} // Needs to be a string.
).pipe(gulp.dest('dist'));
相反,您必须关注"Using multiple sources in one task" recipe。这使您可以合并两个流,每个流都可以接收自己的base 选项:
var merge = require('merge-stream');
gulp.task('default', function() {
merge(gulp.src('source1/examples/**/*.html', {base: 'source1/'}),
gulp.src('source2/examples/**/*.html', {base: 'source2/'}))
.pipe(gulp.dest('dist'));
});