2017-02-27 79 views
0

我正在玩最近的Gulp.js & npm,这太棒了。然而,我并没有真正理解npm作为软件包的包管理器,它将被推向远方。npm - 管理供应商的分销

让我们来看一个例子。

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

但是,我的node_modules目录非常庞大,因为其他包如gulp,并且它根本没有嵌套。什么是对选择的包移动到另一个目录的最简单的方法 - 从长远来看,这对例如src/vendors/

我试图做到这一点通过一饮而尽任务简单地从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' 
    } 
} 

是否有一个选项,做得更快和/或更好?

回答

2

没有必要为每个供应商库明确指定源和目标目录。

请记住,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中的所有内容都以src/resources/vendors/jquery而不是src/resources/vendors/jquery/dist结尾,因此我们必须使用正则表达式在第一个/之后剥离所有内容。

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

+0

呃,作为一个魅力工作。 谢谢老兄! – ficus