我在尝试复制一组文件时遇到了问题,当调用.dest('some folder')时,整个文件夹结构都丢失了。
我搜索并找到了一个答案,建议我在{base:'.'}
致gulp.src(...)
的电话中提供base
作为选项来解决此问题。
documentation for gulp.src options仅表示其选项为:
通过glob-stream传递给node-glob的选项。
根本没有列出node-glob documentation for its options基地 glob-stream options documentation仅表明
“默认值是在glob开始之前的所有内容(请参阅glob-parent)”
这里也没什么帮助。
那么,传递给gulp.src
的{{1}}选项对创建的流中的viny6l文件有什么影响?它如何影响gulp.dest
命令?
答案 0 :(得分:50)
(你不是在看官方的gulp文档。http://github.com/arvindr21/gulp只是gulpjs github repo的一个人的分支。官方的回购是http://github.com/gulpjs/gulp/ base option is indeed documented。< / p>
回答你的问题:
如果您自己未指定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'));
});