【问题标题】:single gulp task for multiple sources and directories多个源和目录的单个 gulp 任务
【发布时间】:2016-09-18 13:32:23
【问题描述】:

我想导入我的node_modules 全部 不是全部。一个规则会很好,而不是为每个模块编写一个新规则。

通常我的任务是这样的:

gulp.task('node_modules', function () {
    return gulp.src('node_modules/**/*')
        .pipe(plumber({
            handleError: function (err) {
                console.log(err);
                this.emit('end');
            }
        }))
        .pipe(gulp.dest('build/node_modules'))
        .pipe(reload({ stream: true }))    
})    

但由于我只想要对我的项目有用的那些,而不是例如对 gulp 有用的,我需要指定它们。但是,如果我指定多个来源,它们将全部合并到 gulp.dest 文件夹中,这样就行不通了。另一方面,如果我抽象出对 gulp 任务的调用(如下面的想法),我想我可能会遇到缺少多个返回值的问题。

我在想这样的事情:

function node_module(module) {
    gulp.task('node_module', function () {
        return gulp.src(`node_modules/${module}/**/*`)
            .pipe(plumber({
                handleError: function (err) {
                    console.log(err);
                    this.emit('end');
                }
            }))
            .pipe(gulp.dest(`build/node_modules/${module}`))
            .pipe(reload({ stream: true }))    
    })    
}
gulp.task('node_modules', function () {
    var rv
    ['event-emitter-es6', 'object-hash', 'urijs'].forEach(m => rv = node_module(m))
    return rv
})

【问题讨论】:

  • 你应该看看像 webpack 或 browserify 这样的打包工具。维护这将是一场噩梦,并且很容易崩溃(例如,因为npm dedupe)。
  • @SvenSchoenung - 谢谢,一般来说这可能是正确的。我刚刚在 webpack 中完成了我的第一个项目,我想回到 gulp 看看它是从哪里来的。在这种情况下,我的节点模块都没有依赖项。所以我仍然想要一个答案,即使它只适用于独立模块。

标签: gulp


【解决方案1】:

如果你真的知道自己在做什么,那么这并不难。

您可以简单地将数组传递给 gulp.src(),其中包含每个模块的 glob。然后,您所要做的就是确保所有内容最终都位于目标目录中的正确位置。

您缺少的关键是使用base option 来防止您的模块在同一目录中被挤压在一起。 (你可以在这个问题中阅读更多关于这个选项的作用:how base option affects gulp.src & gulp.dest)。

gulp.task('node_modules', function () {
  var modules = [ 'event-emitter-es6', 'object-hash', 'urijs' ];
  return gulp.src(modules.map(m => `node_modules/${m}/**/*`, {base:'node_modules'})
    .pipe(plumber({
        handleError: function (err) {
            console.log(err);
            this.emit('end');
        }
    }))
    .pipe(gulp.dest('build/node_modules'))
    .pipe(reload({ stream: true }))    
});

此外,如果您要复制的模块数组与您的 package.json 文件中的 dependencies 相同,您最好从那里获取列表,而不是手动维护它:

var modules = Object.keys(require('./package.json').dependencies);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-06
    • 2023-04-08
    • 2017-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多