NPM saubere Module


144

Gibt es eine Möglichkeit, npm dazu zu bringen, alle Module unter node_modules aufzuheben? So etwas wie npm-Neuerstellung, bei der alle Build-Artefakte entfernt, aber nicht neu erstellt werden?


4
Ich dachte du fragst nie. Ich habe mein Verzeichnis node_modules in git eingecheckt, wie unter mikealrogers.com/posts/nodemodules-in-git.html empfohlen . Wenn ich ein neues Modul hinzufüge oder ein aktuelles aktualisiere, erhalte ich Build-Artefakte in Git, die nicht vorhanden sein sollten, und muss sie bereinigen. Ich dachte, wenn ich sie zuerst reinigen könnte, würde der Prozess etwas reibungsloser verlaufen.
Dave Causey

1
Ein kurzer Hinweis: Jetzt, da NPM unterstützt shrinkwrap(siehe npmjs.org/doc/shrinkwrap.html ), können Sie die Versionen ALLER Ihrer Abhängigkeiten sperren (anstatt nur die der obersten Ebene).
Michelle Tilley

2
Wenn diese Funktion nicht vorhanden ist, ist dies auch für die plattformübergreifende Entwicklung von Vorteil. Wir entwickeln auf Mac und führen CI unter Linux aus und müssen das Verzeichnis node_modules entfernen und jedes Mal, wenn wir einen Build unter Linux durchführen, komplett neu installieren, was eine Menge Zeit verschwendet.
JBCP

4
@JBCP du machst es falsch. Was Sie tun sollten, ist die Installation von Modulen in packages.json(using npm --save) und das Einfügen des node_modulesVerzeichnisses in .gitignore(using git ). CI sollte Ihre node_modules nicht ziehen, sondern ausführen npm install. Wenn das Herunterladen aus der npm-Registrierung zu lange dauert, verwenden Sie etwas wie sinopia, um es zwischenzuspeichern.
Bojan Markovic

1
@BojanMarkovic - Sie haben Recht, so werden unsere Projekte jetzt eingerichtet. Mein Kommentar oben war von vor ungefähr einem Jahr. Es gibt (gab) einige Projekte, die empfohlen haben, node_modules in Git zu übernehmen, aber das ist definitiv nicht korrekt.
JBCP

Antworten:


160

Sie können einfach das Verzeichnis node_module löschen

rm -rf node_modules/

14
Dies würde die Quelle der node_modules sowie die kompilierte Ausgabe entfernen und die Frage nicht beantworten.
TheGecko

Wenn Sie Abhängigkeiten haben, die mit npm link verknüpft sind, können Sie diese
Modulquelle

12
Ich habe dies zu meinem hinzugefügt package.json: "clean": "rm -rf node_modules", "reinstall": "npm run clean && npm install", "rebuild": "npm run clean && npm install && npm run build",. Scheint gut zu funktionieren.
Lucas

5
Für Windows> rd node_modules / s
Ishara Samantha

2
@ Lucas Sie sollten dies eine Antwort posten, da es die am besten geeignete ist
Joseph

56

Ich habe dies zu meinem package.json hinzugefügt:

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

Scheint gut zu funktionieren.


2
cleanmuss in der package.json definiert werden!
Ciasto Piekarz

20
@Ciastopiekarz? Das sagt meine Antwort oben?
Lucas

Verwenden Sie 'rm -rf node_modules' für Linux-basierte Computer, falls Windows 'rmdir / s / q node_modules' vorhanden ist
Mohamed.Abdo

8

Sie können den Befehl 'npm cache' verwenden, mit dem das Paket tarball heruntergeladen und in das Verzeichnis npm cache entpackt wird.

Die Quelle kann dann kopiert werden.

Unter Verwendung von Ideen aus https://groups.google.com/forum/?fromgroups=#!topic/npm-/mwLuZZkHkfU habe ich das folgende Knotenskript entwickelt. Keine Garantien, YMMV usw.

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
Ich finde es sehr seltsam, dass eine solche grundlegende Funktionalität, die von npm empfohlen wird, einen Hack erfordert, um sie zu erreichen. Was machen alle anderen? Ignorieren Sie einfach die Empfehlung und verwenden Sie npm install?
VitalyB

5

Mit einem Wort nein .

In zwei noch nicht .

Es gibt jedoch ein offenes Problem für ein --no-buildFlag, npm installum eine Installation ohne Gebäude durchzuführen, mit dem Sie das tun können, was Sie verlangen.

Siehe diese offene Ausgabe .




3

Ich habe einige Zeilen in package.json hinzugefügt:

"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",
  ...
}

Wenn Sie nur möchten, cleankönnen Sie dies verwenden rimraf node_modules.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.