2016-09-18 71 views
0

我想導入全部並非全部我的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.dest文件夾中,因此不起作用。另一方面,如果我將呼叫抽象爲吞吐任務(如下面的想法),我想我可能遇到缺少多個返回值的問題。

我的想法是這樣的:

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 
}) 
+0

你應該看看打包成webpack或browserify之類的捆綁軟件。維護這將是一場噩夢,並且很容易中斷(例如,由於'npm dedupe')。 –

+0

@SvenSchoenung - 謝謝,這可能是真的。我剛剛在webpack中完成了我的第一個項目,我想回過頭來看看它是從哪裏來的。在這種情況下,我的節點模塊都沒有依賴關係。所以我仍然喜歡答案,即使它只適用於獨立模塊。 –

回答

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); 
+0

哦,基地:)謝謝。 –