基本选项如何影响gulp.src和gulp.dest

epe*_*leg 29 gulp

我在尝试复制一组文件时遇到了问题,当调用.dest('some folder')时,整个文件夹结构都丢失了.

我搜索并找到了一个答案,建议我应该提供解决此问题{base:'.'}的选项gulp.src(...).

gulp.src选项文档只说它的选项是:

通过glob-stream传递给node-glob的选项.

展望其选择的节点水珠文档基地都没有被列入其中.
glob-stream选项文档只说明了这一点

"默认值是在glob开始之前的所有内容(请参阅glob-parent)"

所以在这里也没什么帮助.

那么,base选项传递给gulp.src创建的流中的viny6l文件有什么影响gulp.dest?它如何影响命令?

Sve*_*ung 58

(你不看官方一饮而尽文档.http://github.com/arvindr21/gulp只是一些家伙的gulpjs GitHub库叉,官方回购是http://github.com/gulpjs/gulp/ 确实记录基本选项的位置.)

回答你的问题:

如果您没有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
Run Code Online (Sandbox Code Playgroud)

这是你的Gulpfile.js:

gulp.src('some/path/**/js/*.js')
  .pipe(gulp.dest('output'));
Run Code Online (Sandbox Code Playgroud)

在这种情况下,之前的所有内容**都会自动用作您的base选项.所以上面基本上等同于:

gulp.src('some/path/**/js/*.js', {base:'some/path/'})
  .pipe(gulp.dest('output'));
Run Code Online (Sandbox Code Playgroud)

这意味着some/path/从每个匹配模式的文件的路径中剥离gulp.src().output文件夹中的结果结构如下所示:

output/example/app/js/app.js
output/example/vendor/js/vendor.js
output/example/vendor/lib/js/lib.js
Run Code Online (Sandbox Code Playgroud)

因此,源文件的目录结构的某些部分确实丢失了.丢失的目录结构有多少取决于gulp.src()模式中第一个glob的位置.

如果要避免这种情况,则必须明确指定base选项:

gulp.src('some/path/**/js/*.js', {base:'.'})
  .pipe(gulp.dest('output'));
Run Code Online (Sandbox Code Playgroud)

现在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
Run Code Online (Sandbox Code Playgroud)

编辑:如果您传递一组模式,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'));
Run Code Online (Sandbox Code Playgroud)

相反,您必须遵循"在一个任务中使用多个源"配方.这允许您合并两个流,每个流都可以接收自己的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'));
});
Run Code Online (Sandbox Code Playgroud)

  • 10X.你知道如果我想为不同的glob模式指定不同的基本路径(在数组中给出)会怎么样?例如,如果我有['source1/examples/**/*.html','source2/examples/**/*.html']并且我想将所有示例合并为单个'/ dist/examples /'文件夹? (2认同)
  • 这个解释再好不过了! (2认同)