Modules propres NPM


144

Existe-t-il un moyen d'obtenir npm pour déconstruire tous les modules sous node_modules? Quelque chose comme npm rebuild qui supprime tous les artefacts de build mais ne les reconstruit pas?


4
Je pensais que tu ne demanderais jamais. J'ai vérifié mon répertoire node_modules dans git comme recommandé dans mikealrogers.com/posts/nodemodules-in-git.html . Lorsque j'ajoute un nouveau module ou que j'en mets à jour un module actuel, je me retrouve avec des artefacts de construction dans git qui ne devraient pas être là et je dois les nettoyer. Je pensais que si je pouvais les nettoyer d'abord, le processus se déroulerait un peu plus facilement.
Dave Causey

1
Une note rapide: maintenant que NPM prend en charge shrinkwrap(voir npmjs.org/doc/shrinkwrap.html ), vous pouvez verrouiller les versions de TOUTES vos dépendances (au lieu de seulement celles de niveau supérieur).
Michelle Tilley

2
Ne pas avoir cette fonctionnalité est également nul pour le développement multiplateforme. Nous développons sur Mac et exécutons CI sous Linux, et devons supprimer le répertoire node_modules et le réinstaller complètement à chaque fois que nous faisons une compilation sous Linux, ce qui nous fait perdre beaucoup de temps.
JBCP

4
@JBCP vous vous trompez. Ce que vous devriez faire, c'est installer des modules dans packages.json(using npm --save) et mettre le node_modulesrépertoire .gitignore(si vous utilisez git ). CI ne doit pas extraire vos node_modules, mais s'exécuter npm install. Enfin, si le téléchargement à partir du registre npm prend trop de temps, utilisez quelque chose comme sinopia pour le mettre en cache.
Bojan Markovic

1
@BojanMarkovic - Vous avez raison, c'est ainsi que nos projets sont mis en place maintenant. Mon commentaire ci-dessus remontait à environ un an. Il y a (étaient) quelques projets qui recommandaient de valider node_modules dans Git, mais ce n'est certainement pas correct.
JBCP

Réponses:


160

Vous pouvez simplement supprimer le répertoire node_module

rm -rf node_modules/

15
Cela supprimerait la source des node_modules ainsi que la sortie compilée, donc ne répond pas à la question.
theGecko

Si vous avez des dépendances liées au lien npm, il pourrait aussi bien supprimer ces modules source dans son répertoire source, ce qui peut être assez pénible ...
cschuff

12
J'ai ajouté à mon package.json: "clean": "rm -rf node_modules", "reinstall": "npm run clean && npm install", "rebuild": "npm run clean && npm install && npm run build",. Semble bien fonctionner.
Lucas

5
Pour Windows> rd node_modules / s
Ishara Samantha

2
@Lucas, vous devriez poster cette réponse car c'est la plus appropriée
Joseph

57

J'ai ajouté ceci à mon 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",

Semble bien fonctionner.


2
cleandoit être défini dans le package.json!
Ciasto piekarz

20
@Ciastopiekarz? C'est ce que ma réponse dit ci-dessus?
Lucas

utilisez 'rm -rf node_modules' dans le cas d'une machine basée sur Linux, dans le cas de windows 'rmdir / s / q node_modules'
Mohamed.Abdo

Pour les utiliser, vous ne pouvez pas appeler "npm clean" car clean n'est pas l'un des noms acceptés sur npm. Vous devez faire "npm run clean".
PCoelho

8

Vous pouvez profiter de la commande 'npm cache' qui télécharge l'archive tar du package et la décompresse dans le répertoire de cache npm.

La source peut ensuite être copiée.

En utilisant des idées glanées sur https://groups.google.com/forum/?fromgroups=#!topic/npm-/mwLuZZkHkfU, j'ai créé le script de nœud suivant. Aucune garantie, YMMV, etc.

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
Je trouve très étrange qu'une telle fonctionnalité de base, qui est en fait recommandée par npm, nécessite un hack pour atteindre. Que fait tout le monde? Ignorez simplement la recommandation et utilisez npm install?
VitalyB

5

En un mot non .

En deux, pas encore .

Il y a, cependant, un problème ouvert pour qu'un --no-builddrapeau npm installeffectue une installation sans construction, qui pourrait être utilisé pour faire ce que vous demandez.

Voir ce problème ouvert .



4

Pour l'environnement Windows:

"scripts": {
    "clean": "rmdir /s /q node_modules",
    ...
}

3

J'ai ajouté quelques lignes dans 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 vous le souhaitez, cleanvous pouvez l'utiliser rimraf node_modules.


1

Il existe en fait une commande spéciale pour ce travail

npm ci

Il supprimera le node_modulesrépertoire et installera les packages en respectant votre package-lock.jsonfichier

Plus d'infos: https://docs.npmjs.com/cli/ci.html

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.