NPM módulos limpios


144

¿Hay alguna manera de hacer que npm descomprima todos los módulos en node_modules? ¿Algo como npm rebuild que elimina todos los artefactos de construcción pero no los reconstruye?


44
Pensé que nunca preguntarias. He estado revisando mi directorio node_modules en git como se recomienda en mikealrogers.com/posts/nodemodules-in-git.html . Cuando agrego un nuevo módulo o actualizo uno actual, termino con artefactos de compilación en git que no deberían estar allí y tengo que limpiarlos. Estaba pensando que si pudiera limpiarlos primero, el proceso sería un poco más fácil.
— Dave Causey

1
Una nota rápida: ahora que NPM admite shrinkwrap(consulte npmjs.org/doc/shrinkwrap.html ), puede bloquear las versiones de TODAS sus dependencias (en lugar de solo las de nivel superior).
— Michelle Tilley

2
No tener esta característica también es una mierda para el desarrollo multiplataforma. Desarrollamos en Mac y ejecutamos CI en Linux, y necesitamos eliminar el directorio node_modules y volver a instalarlo cada vez que hacemos una compilación en Linux, lo que desperdicia un montón de tiempo.
— JBCP

44
@JBCP lo estás haciendo mal. Lo que debería hacer es instalar módulos en packages.json(usando npm --save) y poner el node_modulesdirectorio en .gitignore(si usa git ). CI no debe extraer sus node_modules, sino ejecutarlos npm install. Finalmente, si la descarga del registro npm toma demasiado tiempo, use algo como sinopia para almacenarlo en caché.
— Bojan Markovic

1
@BojanMarkovic - Tienes razón, así es como se configuran nuestros proyectos ahora. Mi comentario anterior fue de hace aproximadamente un año. Hay (fueron) algunos proyectos que recomendaron comprometer node_modules en Git, pero eso definitivamente no es correcto.
— JBCP

Respuestas:


160

Simplemente puede eliminar el directorio node_module

rm -rf node_modules/

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

Si ha vinculado con dependencias enlace NPM que bien podría eliminar estos módulos fuente en ella del directorio de origen que puede ser bastante doloroso ...
— cschuff

12
He añadido esto a mi package.json: "clean": "rm -rf node_modules", "reinstall": "npm run clean && npm install", "rebuild": "npm run clean && npm install && npm run build",. Parece funcionar bien.
— Lucas

55
Para windows> rd node_modules / s
— Ishara Samantha

2
@Lucas deberías publicar esto y una respuesta ya que es la más adecuada
— Joseph

57

Agregué esto a mi package.json:

"build": "npm build",
"clean": "rm -rf node_modules", 
"reinstall": "npm run clean && npm install", 
"rebuild": "npm run clean && npm install && npm run build",

Parece funcionar bien.


2
cleantiene que ser definido en el paquete.json!
— Ciasto piekarz

20
@Ciastopiekarz? Eso es lo que dice mi respuesta arriba?
— Lucas

use 'rm -rf node_modules' en el caso de una máquina basada en Linux, en caso de windows 'rmdir / s / q node_modules'
— Mohamed.Abdo

Para usarlos no se puede llamar "npm clean" ya que clean no es uno de los nombres aceptados en npm. Debe hacer "npm run clean".
— PCoelho

8

Puede aprovechar el comando 'npm cache' que descarga el paquete tarball y lo descomprime en el directorio npm cache.

La fuente se puede copiar en.

Utilizando ideas obtenidas de https://groups.google.com/forum/?fromgroups=#!topic/npm-/mwLuZZkHkfU se me ocurrió el siguiente script de 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 %s@%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());

12
Me resulta muy extraño que una funcionalidad tan básica, que en realidad es recomendada por npm, requiera un truco para lograrlo. ¿Qué hacen todos los demás? ¿Ignorar la recomendación y usar npm install?
— VitalyB

5

En una palabra no .

En dos, todavía no .

Sin embargo, hay un problema abierto para que una --no-buildbandera npm installrealice una instalación sin construir, que podría usarse para hacer lo que está pidiendo.

Ver este tema abierto .




3

He agregado algunas líneas dentro de package.json:

"scripts": {
  ...
  "clean": "rmdir /s /q node_modules",
  "reinstall": "npm run clean && npm install",
  "rebuild": "npm run clean && npm install && rmdir /s /q dist && npm run build --prod",
  ...
}

Si cleansolo quieres, puedes usar esto rimraf node_modules.


0

En realidad hay un comando especial para este trabajo

npm ci

Eliminará el node_modulesdirectorio e instalará paquetes con respecto a su package-lock.jsonarchivo

Más información: https://docs.npmjs.com/cli/ci.html

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.