2012-07-05 15 views
77

¿Hay alguna manera de que npm reconstruya todos los módulos en node_modules? ¿Algo como npm Rebuild que elimina todos los artefactos de compilación pero no los reconstruye?Módulos limpios de NPM

+0

¿Podría explicar por qué necesita hacer esto? –

+3

Pensé que nunca preguntarías. He estado revisando mi directorio node_modules en git como se recomienda en http://www.mikealrogers.com/posts/nodemodules-in-git.html. Cuando agrego un módulo nuevo o actualizo uno actual, termino con artefactos de construcción en git que no deberían estar allí y tengo que limpiarlos. Estaba pensando que si podía limpiarlos primero el proceso sería un poco más suave. –

+1

Una nota rápida: ahora que NPM admite 'shrinkwrap' (vea http://npmjs.org/doc/shrinkwrap.html), puede bloquear las versiones de TODAS sus dependencias (en lugar de solo las de nivel superior). –

Respuesta

103

Usted puede simplemente eliminar el directorio node_module

rm -rf node_modules/ 
+12

Esto eliminaría la fuente de node_modules así como la salida compilada, por lo que no responde la pregunta. – theGecko

+0

Si tiene dependencias vinculadas con el enlace npm, también podría eliminar estos módulos fuente en su directorio de origen, lo que puede ser bastante doloroso ... – cschuff

+0

De hecho, me gusta esto. A veces todo lo que necesita es eliminar los node_modules y volver a instalarlos –

7

Usted puede tomar ventaja del comando 'NPM caché' que descarga el archivo comprimido del paquete y descomprime en el directorio de caché de la NGP.

La fuente puede ser copiado en.

Usando las ideas extraídas de https://groups.google.com/forum/?fromgroups=#!topic/npm-/mwLuZZkHkfU me ocurrió con la escritura siguiente nodo. Sin garantías, YMMV, etcétera.

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

Me resulta muy extraño que una funcionalidad tan básica, que en realidad es recomendada por npm, requiera un hack para lograrlo. ¿Qué hacen todos los demás? Simplemente ignore la recomendación y use 'npm install'? – VitalyB

5

En una palabra sin.

En dos, aún no.

Hay, sin embargo, un problema abierto para --no-build para npm install para realizar una instalación sin compilación, que podría utilizarse para hacer lo que está pidiendo.

Ver this open issue.

Cuestiones relacionadas