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.