2012-07-05 144 views
77

有沒有辦法讓npm建立node_modules下的所有模塊?像npm重建,刪除所有構建工件,但不重建它們?NPM清潔模塊

+0

你能否詳細說明爲什麼你需要這樣做? – 2012-07-05 20:08:02

+3

以爲你永遠不會問。我一直在按照http://www.mikealrogers.com/posts/nodemodules-in-git.html中的建議將我的node_modules目錄轉換爲git。當我添加一個新模塊或更新當前模塊時,我最終將在git中創建構件,而這些構件不應該在那裏並且必須清理它們。我想如果我能先清理它們,那麼這個過程會更順利一點。 – 2012-07-05 20:24:20

+1

一個簡單的提示:現在NPM支持「shrinkwrap」(請參閱​​http://npmjs.org/doc/shrinkwrap.html),您可以鎖定所有依賴項的版本(而不僅僅是頂級版本)。 – 2012-07-05 22:39:30

回答

103

您可以直接刪除node_module目錄

rm -rf node_modules/ 
+12

這將刪除node_modules的源以及編譯的輸出,所以不會回答問題。 – theGecko 2012-12-18 20:42:17

+0

如果你有與npm鏈接鏈接的依賴項,它可能會刪除源代碼目錄中的這些模塊源,這可能會很痛苦...... – cschuff 2016-06-07 11:40:31

+0

我其實很喜歡這個。有時你只需要移除node_modules並重新安裝它們 – 2016-11-20 05:53:52

7

你可以把它下載軟件包壓縮包然後解壓縮到故宮緩存目錄中的「故宮緩存」命令的優勢。

源可以再被複制。

運用https://groups.google.com/forum/?fromgroups=#!topic/npm-/mwLuZZkHkfU收集的想法,我想出了以下節點的腳本。沒有保證,YMMV等等。

var fs = require('fs'), 
path = require('path'), 
exec = require('child_process').exec, 
util = require('util'); 

var packageFileName = 'package.json'; 
var modulesDirName = 'node_modules'; 
var cacheDirectory = process.cwd(); 
var npmCacheAddMask = 'npm cache add %[email protected]%s; echo %s'; 
var sourceDirMask = '%s/%s/%s/package'; 
var targetDirMask = '%s/node_modules/%s'; 

function deleteFolder(folder) { 
    if (fs.existsSync(folder)) { 
     var files = fs.readdirSync(folder); 
     files.forEach(function(file) { 
      file = folder + "/" + file; 
      if (fs.lstatSync(file).isDirectory()) { 
       deleteFolder(file); 
      } else { 
       fs.unlinkSync(file); 
      } 
     }); 
     fs.rmdirSync(folder); 
    } 
} 

function downloadSource(folder) { 
    var packageFile = path.join(folder, packageFileName); 
    if (fs.existsSync(packageFile)) { 
     var data = fs.readFileSync(packageFile); 
     var package = JSON.parse(data); 

     function getVersion(data) { 
      var version = data.match(/-([^-]+)\.tgz/); 
      return version[1]; 
     } 

     var callback = function(error, stdout, stderr) { 
      var dependency = stdout.trim(); 
      var version = getVersion(stderr); 
      var sourceDir = util.format(sourceDirMask, cacheDirectory, dependency, version); 
      var targetDir = util.format(targetDirMask, folder, dependency); 
      var modulesDir = folder + '/' + modulesDirName; 

      if (!fs.existsSync(modulesDir)) { 
       fs.mkdirSync(modulesDir); 
      } 

      fs.renameSync(sourceDir, targetDir); 
      deleteFolder(cacheDirectory + '/' + dependency); 
      downloadSource(targetDir); 
     }; 

     for (dependency in package.dependencies) { 
      var version = package.dependencies[dependency]; 
      exec(util.format(npmCacheAddMask, dependency, version, dependency), callback); 
     } 
    } 
} 

if (!fs.existsSync(path.join(process.cwd(), packageFileName))) { 
    console.log(util.format("Unable to find file '%s'.", packageFileName)); 
    process.exit(); 
} 

deleteFolder(path.join(process.cwd(), modulesDirName)); 
process.env.npm_config_cache = cacheDirectory; 
downloadSource(process.cwd()); 
+11

我覺得很奇怪,這樣一個基本的功能,實際上是由npm推薦的,需要黑客來實現。其他人做什麼?只要忽略建議並使用'npm install'? – VitalyB 2014-04-20 08:47:26

5

總之

二,尚未

但是,有一個--no-build標誌到npm install執行沒有構建的安裝的開放性問題,可用於執行您所要求的。

請參閱this open issue