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.