Moduli puliti NPM


144

C'è un modo per ottenere npm per sbloccare tutti i moduli in node_modules? Qualcosa come npm rebuild che rimuove tutti i manufatti di build ma non li ricostruisce?


4
Pensavo non l'avresti mai chiesto. Ho controllato la mia directory node_modules in git come raccomandato in mikealrogers.com/posts/nodemodules-in-git.html . Quando aggiungo un nuovo modulo o ne aggiorno uno attuale, finisco con manufatti di build in git che non dovrebbero essere lì e li devo ripulire. Stavo pensando che se potessi pulirli prima il processo sarebbe andato un po 'più agevolmente.
Dave Causey,

1
Una breve nota: ora che NPM supporta shrinkwrap(vedi npmjs.org/doc/shrinkwrap.html ), puoi bloccare le versioni di TUTTE le tue dipendenze (anziché solo quelle di livello superiore).
Michelle Tilley,

2
Non avere questa funzione fa schifo anche per lo sviluppo multipiattaforma. Sviluppiamo su Mac ed eseguiamo CI su Linux e dobbiamo rimuovere la directory node_modules e reinstallarla completamente ogni volta che realizziamo una build su Linux, che richiede molto tempo.
JBCP,

4
@JBCP stai sbagliando. Quello che dovresti fare è installare i moduli packages.json(usando npm --save) e inserire la node_modulesdirectory .gitignore(se usi git ). CI non dovrebbe estrarre i node_modules, ma eseguirli npm install. Infine, se il download dal registro di npm impiega troppo tempo, utilizzare qualcosa come sinopia per memorizzarlo nella cache.
Bojan Markovic

1
@BojanMarkovic - Hai ragione, ecco come sono adesso i nostri progetti. Il mio commento sopra è di circa un anno fa. Ci sono (erano) alcuni progetti che raccomandavano di eseguire il commit di node_modules in Git, ma questo non è assolutamente corretto.
JBCP,

Risposte:


160

Puoi semplicemente eliminare la directory node_module

rm -rf node_modules/

14
Ciò eliminerebbe l'origine di node_modules e l'output compilato, quindi non risponde alla domanda.
theGecko,

Se hai dipendenze collegate con il collegamento npm, potresti anche eliminare questi moduli sorgente nella sua directory sorgente che può essere abbastanza dolorosa ...
cschuff

12
Ho aggiunto questo al mio package.json: "clean": "rm -rf node_modules", "reinstall": "npm run clean && npm install", "rebuild": "npm run clean && npm install && npm run build",. Sembra funzionare bene.
Lucas,

5
Per windows> secondo node_modules / s
Ishara Samantha,

2
@Lucas dovresti postare una risposta in quanto è la più adatta
Joseph

57

Ho aggiunto questo al mio 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",

Sembra funzionare bene.


2
cleandeve essere definito in package.json!
Ciasto piekarz,

20
@Ciastopiekarz? È quello che dice la mia risposta sopra?
Lucas,

usa 'rm -rf node_modules' nel caso di macchine basate su Linux, in caso di 'rmdir / s / q node_modules' di
Windows

Per usarli non puoi chiamare "npm clean" poiché clean non è uno dei nomi accettati su npm. Devi fare "npm run clean".
PCoelho

8

È possibile sfruttare il comando 'npm cache' che scarica il pacchetto tarball e lo decomprime nella directory cache npm.

La fonte può quindi essere copiata.

Usando le idee raccolte da https://groups.google.com/forum/?fromgroups=#!topic/npm-/mwLuZZkHkfU, ho ideato il seguente script del nodo. Nessuna garanzia, YMMV, eccetera.

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
Trovo molto strano che una tale funzionalità di base, che è effettivamente raccomandata da npm, richieda un hack per raggiungere. Cosa fanno gli altri? Basta ignorare la raccomandazione e utilizzare npm install?
VitalyB,

5

In una parola no .

In due, non ancora .

Vi è, tuttavia, un problema aperto per un --no-buildflag per npm installeseguire un'installazione senza edificio, che potrebbe essere utilizzato per fare ciò che stai chiedendo.

Vedi questo numero aperto .




3

Ho aggiunto alcune righe all'interno di 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",
  ...
}

Se vuoi cleansolo puoi usarlo rimraf node_modules.


0

Esiste effettivamente un comando speciale per questo lavoro

npm ci

Eliminerà la node_modulesdirectory e installerà i pacchetti nel rispetto del tuo package-lock.jsonfile

Ulteriori informazioni: https://docs.npmjs.com/cli/ci.html

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.