Módulos limpos do NPM


144

Existe uma maneira de obter o npm para descompactar todos os módulos em node_modules? Algo como o npm reconstruir que remove todos os artefatos de construção, mas não os reconstrói?


4
Achei que você nunca iria perguntar. Estive verificando meu diretório node_modules no git, conforme recomendado em mikealrogers.com/posts/nodemodules-in-git.html . Quando adiciono um novo módulo ou atualizo um atual, acabo criando artefatos no git que não deveriam estar lá e precisavam limpá-los. Eu estava pensando que se eu pudesse limpá-los primeiro, o processo seria um pouco mais tranquilo.
precisa

1
Uma observação rápida: agora que o NPM suporta shrinkwrap(consulte npmjs.org/doc/shrinkwrap.html ), você pode bloquear as versões de TODAS as suas dependências (em vez de apenas as de nível superior).
31412 Michelle Michelle Tilley

2
Não ter esse recurso é uma droga para o desenvolvimento de várias plataformas também. Desenvolvemos no Mac e executamos o CI no Linux, e precisamos remover o diretório node_modules e reinstalar completamente toda vez que fazemos uma compilação no Linux, o que desperdiça uma tonelada de tempo.
JBCP 15/08/14

4
@JBCP você está fazendo errado. O que você deve fazer é instalar os módulos no packages.json(usando npm --save) e colocar o node_modulesdiretório .gitignore(se estiver usando o git ). O IC não deve puxar seus node_modules, mas executado npm install. Finalmente, se o download do registro npm demorar muito, use algo como sinopia para armazená -lo em cache.
Bojan Markovic

1
@BojanMarkovic - Você está correto, é assim que nossos projetos estão configurados agora. Meu comentário acima foi de cerca de um ano atrás. Existem alguns projetos que recomendam a instalação de node_modules no Git, mas isso definitivamente não está correto.
JBCP

Respostas:


160

Você pode simplesmente excluir o diretório node_module

rm -rf node_modules/

14
Isso removeria a fonte dos node_modules e a saída compilada, portanto não responde à pergunta.
TheGecko

Se você tiver dependências ligadas com ligação npm bem que poderia eliminar estes módulos de fonte nele do diretório de origem que pode ser muito doloroso ...
cschuff

12
Eu adicionei isso ao meu package.json: "clean": "rm -rf node_modules", "reinstall": "npm run clean && npm install", "rebuild": "npm run clean && npm install && npm run build",. Parece funcionar bem.
Lucas

5
Para Windows> rd node_modules / s
Ishara Samantha

2
@Lucas você deve postar isso uma resposta, pois é o mais adequado
Joseph

57

Adicionei isso ao meu 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 bem.


2
cleandeve ser definido no package.json!
Ciasto piekarz

20
@Ciastopiekarz? Isso é o que minha resposta diz acima?
Lucas

use 'rm -rf node_modules' no caso de máquina baseada em linux, no caso do windows 'rmdir / s / q node_modules'
Mohamed.Abdo

8

Você pode tirar proveito do comando 'npm cache', que baixa o pacote tarball e o descompacta no diretório npm cache.

A fonte pode então ser copiada.

Usando idéias obtidas em https://groups.google.com/forum/?fromgroups=#!topic/npm-/mwLuZZkHkfU, criei o seguinte script de nó. Sem garantias, 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
Acho muito estranho que uma funcionalidade tão básica, que é realmente recomendada pelo npm, exija um hack. O que todo mundo faz? Apenas ignore a recomendação e use npm install?
VitalyB

5

Numa palavra não .

Em dois, ainda não .

No entanto, existe um problema em aberto para um --no-buildsinalizador npm installexecutar uma instalação sem construção, que pode ser usada para fazer o que você está pedindo.

Veja esta edição em aberto .




3

Eu adicionei algumas linhas dentro do 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 você quiser cleanapenas você pode usar isso rimraf node_modules.


0

Na verdade, existe um comando especial para este trabalho

npm ci

Ele excluirá o node_modulesdiretório e instalará pacotes com respeito ao seu package-lock.jsonarquivo

Mais informações: https://docs.npmjs.com/cli/ci.html

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.