NPM чисті модулі


144

Чи є спосіб отримати npm, щоб розбудувати всі модулі під node_modules? Щось на зразок npm відновлення, яке видаляє всі артефакти побудови, але не відновлює їх?


4
Думав, що ніколи не запитаєш. Я перевіряв свій каталог node_modules в git, як рекомендовано в mikealrogers.com/posts/nodemodules-in-git.html . Коли я додаю новий модуль або оновлюю поточний, я закінчую створення артефактів у git, яких там не повинно бути, і потрібно їх очистити. Я думав, що коли б я міг їх очистити спочатку, процес піде трохи гладше.
Дейв Косі

1
Одне швидке зауваження: тепер, коли NPM підтримує shrinkwrap(див. Npmjs.org/doc/shrinkwrap.html ), ви можете заблокувати версії ВСІХ залежностей (замість лише верхніх рівнів).
Мішель Тіллі

2
Не маючи цієї функції, це також корисно для розробки крос-платформ. Ми розробляємо на Mac і запускаємо CI в Linux, і нам потрібно видалити каталог node_modules і повністю перевстановити кожен раз, коли ми робимо збірку на Linux, що витрачає багато часу.
JBCP

4
@JBCP ти робиш це неправильно. Що вам слід зробити, це встановити модулі в packages.json(за допомогою npm --save) та ввести node_modulesкаталог .gitignore(якщо ви використовуєте git ). CI не повинен тягнути ваші node_modules, а виконувати npm install. Нарешті, якщо завантаження з реєстру npm займає занадто багато часу, використовуйте щось схоже на sinopia, щоб кешувати його.
Боян Маркович

1
@BojanMarkovic - Ви праві, ось так налаштовані наші проекти зараз. Мій коментар вище був приблизно від року тому. Є (було) кілька проектів, які рекомендували вводити node_modules в Git, але це, безумовно, не вірно.
JBCP

Відповіді:


160

Ви можете просто видалити каталог node_module

rm -rf node_modules/

14
Це призведе до видалення джерела модулів node_, а також зібраного виводу, тому не відповідає на питання.
theGecko

Якщо у вас є залежності, пов'язані з npm-посиланням, це може також видалити джерело цих модулів у його вихідному каталозі, що може бути дуже боляче ...
cschuff

12
Я додав це до мого package.json: "clean": "rm -rf node_modules", "reinstall": "npm run clean && npm install", "rebuild": "npm run clean && npm install && npm run build",. Здається, добре працює.
Лукас

5
Для windows> rd node_modules / s
Ishara Samantha

2
@Lucas, ви повинні опублікувати цю відповідь, оскільки вона є найбільш підходящою
Джозеф

57

Я додав це до свого пакета.json:

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

Здається, добре працює.


2
cleanмає бути визначено в package.json!
Ciasto piekarz

20
@Ciastopiekarz? Це те, що моя відповідь говорить вище?
Лукас

використовуйте 'rm -rf node_modules' у випадку машини на базі Linux, в корпусі Windows 'rmdir / s / q node_modules'
Mohamed.Abdo

Для їх використання ви не можете викликати "npm clean", оскільки clean не є одним із прийнятих імен на npm. Вам потрібно зробити "npm run clean".
PCoelho

8

Ви можете скористатися командою 'npm cache', яка завантажує тарбол пакету та розпаковує його в каталог кешу npm.

Потім джерело можна скопіювати.

Використовуючи ідеї, зібрані з https://groups.google.com/forum/?fromgroups=#!topic/npm-/mwLuZZkHkfU, я придумав такий сценарій вузла. Ніяких гарантій, YMMV, тощо.

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
Мені здається дуже дивним, що такий базовий функціонал, який фактично рекомендується npm, вимагає злому для досягнення. Що роблять усі інші? Просто ігноруйте рекомендацію та використовуйте npm install?
ВіталійB

5

Словом ні .

Двоє, ще не .

Однак існує відкрите питання для --no-buildпрапора, щоб npm installвиконати встановлення без будівництва, яке може бути використане для виконання того, що ви просите.

Дивіться це відкрите питання .




3

Я додав кілька рядків всередині 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",
  ...
}

Якщо ви хочете cleanлише ви можете скористатися цим rimraf node_modules.


0

Насправді є спеціальна команда для цієї роботи

npm ci

Він видалить node_modulesкаталог і встановить пакунки щодо вашого package-lock.jsonфайлу

Більше інформації: https://docs.npmjs.com/cli/ci.html

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.