【问题标题】:how base option affects gulp.src & gulp.destbase 选项如何影响 gulp.src 和 gulp.dest
【发布时间】:2016-06-21 01:55:07
【问题描述】:

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

我搜索并找到了一个答案,建议我应该在致电gulp.src(...) 时提供{base:'.'} 作为选项来解决此问题。

documentation for gulp.src options 只说它的选项是:

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

查看node-glob documentation for its options base 根本没有列出。
glob-stream options documentation 只声明

“默认值是 glob 开始之前的所有内容(参见 glob-parent)”

所以这里也没有太多帮助。

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

【问题讨论】:

    标签: gulp


    【解决方案1】:

    (您没有查看官方的 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'));
    });
    

    【讨论】:

    • 10 倍。你知道如果我想为不同的 glob 模式(在数组中给出)指定不同的基本路径怎么办?例如如果我有 ['source1/examples/**/*.html','source2/examples/**/*.html'] 并且我想将所有示例合并到一个 '/dist/examples/' 文件夹?
    • 当源文件在 '../somefolder/' 中(即 gulp 的同级文件夹)并且 dest 应该在 './dest/subfolder 中时,是否有任何特殊方面'?
    • 我不知道在这种情况下有任何陷阱。我希望它能够像任何其他相对路径一样工作。
    • 这个解释再好不过了!
    • 感谢您提供详细信息! 'base' 选项的链接已损坏。
    猜你喜欢
    • 2014-07-20
    • 2014-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多