2

我最近在玩 Gulp.js & npm,很棒。但是,我并没有真正理解 npm 作为将被推送到 dist 的包的包管理器的想法。

让我们举个例子。

我想下载最新的 jquery、bootstrap 和 font-awesome,这样我就可以将它们包含到我的项目中。我可以简单地从他们的网站下载它们并获取要包含的文件。另一种选择似乎是数据包管理器,即 NPM。

但是,由于 gulp 等其他软件包,我的 node_modules 目录很大,而且根本没有嵌套。将选定的包移动到另一个目录的最简单方法是什么 - 例如src/vendors/

我试图通过 gulp 任务简单地复制指定的文件node_modules并将它们移动到指定的目录来实现这一点,但从长远来看,它与手动复制文件几乎相同,因为我不仅必须指定输入目录,还需要指定输出每个包的目录。

我目前的解决方案:

gulp.task('vendors', function() {

    var jquery = gulp.src(vendors.src.jquery)
       .pipe(gulp.dest(vendors.dist.jquery));

    var bootstrap = gulp.src(vendors.src.bootstrap)
       .pipe(gulp.dest(vendors.dist.bootstrap));

    return merge(jquery, bootstrap);
});

vendors = {
    src: {
        jquery: 'node_modules/jquery/dist/**/*',
        bootstrap: 'node_modules/bootstrap/dist/**/*'
    },
    dist: {
        jquery: 'src/resources/vendors/jquery',
        bootstrap: 'src/resources/vendors/bootstrap'
    }
}

有没有更快和/或更好的选择?

4

1 回答 1

5

无需为每个供应商库显式指定源目录和目标目录。

请记住,gulp 只是 JavaScript。这意味着你可以使用循环、数组和 JavaScript 提供的任何其他东西。

在您的情况下,您可以简单地维护供应商文件夹名称列表,遍历该列表并为每个文件夹构造一个流。然后用于merge-stream合并流:

var gulp = require('gulp');
var merge = require('merge-stream');

var vendors = ['jquery/dist', 'bootstrap/dist'];

gulp.task('vendors', function() {
  return merge(vendors.map(function(vendor) {
    return gulp.src('node_modules/' + vendor + '/**/*')
      .pipe(gulp.dest('src/resources/vendors/' + vendor.replace(/\/.*/, '')));
  }));
});

上面唯一棘手的部分是正确找出目标目录。我们希望所有内容都node_modules/jquery/dist以 insrc/resources/vendors/jquery而不是 in结束,因此我们必须在第一次使用正则表达式src/resources/vendors/jquery/dist之后剥离所有内容。/

现在,当您安装新库时,您只需将其添加到vendors阵列并再次运行任务即可。

于 2017-02-27T18:30:56.910 回答