Modul bersih NPM

144

Apakah ada cara untuk mendapatkan npm untuk menghapus semua modul di bawah node_modules? Sesuatu seperti npm yang membangun kembali yang menghapus semua artefak yang dibangun tetapi tidak membangunnya kembali?

Dave Causey
sumber
4
Kupikir kau tidak akan pernah bertanya. Saya telah memeriksa direktori node_modules saya ke git seperti yang direkomendasikan di mikealrogers.com/posts/nodemodules-in-git.html . Ketika saya menambahkan modul baru atau memperbarui yang sekarang, saya berakhir dengan membangun artefak di git yang seharusnya tidak ada di sana dan harus membersihkannya. Saya berpikir jika saya bisa membersihkannya terlebih dahulu prosesnya akan berjalan sedikit lebih lancar.
Dave Causey
1
Satu catatan singkat: sekarang NPM mendukung shrinkwrap(lihat npmjs.org/doc/shrinkwrap.html ), Anda dapat mengunci versi SEMUA dependensi Anda (bukan hanya yang tingkat atas).
Michelle Tilley
2
Tidak memiliki fitur ini menyebalkan untuk pengembangan lintas platform juga. Kami mengembangkan di Mac dan menjalankan CI di Linux, dan perlu menghapus direktori node_modules dan menginstal ulang sepenuhnya setiap kali kami membangun di Linux, yang menghabiskan banyak waktu.
JBCP
4
@ JBCP Anda salah melakukannya. Yang harus Anda lakukan adalah menginstal modul di packages.json(menggunakan npm --save) dan memasukkan node_modulesdirektori .gitignore(jika menggunakan git ). CI seharusnya tidak menarik node_modules Anda, tetapi jalankan npm install. Akhirnya, jika mengunduh dari npm registry terlalu lama, gunakan sesuatu seperti sinopia untuk menyimpannya.
Bojan Markovic
1
@ BojanMarkovic - Anda benar, ini adalah bagaimana proyek kami diatur sekarang. Komentar saya di atas berasal dari sekitar setahun yang lalu. Ada beberapa proyek yang merekomendasikan melakukan node_modules ke Git, tapi itu jelas tidak benar.
JBCP

Jawaban:

160

Anda cukup menghapus direktori node_module

rm -rf node_modules/
Charles
sumber
14
Ini akan menghapus sumber node_modules serta output yang dikompilasi, jadi tidak menjawab pertanyaan.
theGecko
Jika Anda memiliki dependensi yang ditautkan dengan tautan npm, sebaiknya hapus juga modul-modul ini di direktori sumbernya yang bisa sangat menyakitkan ...
cschuff
12
Saya menambahkan ini ke saya package.json: "clean": "rm -rf node_modules", "reinstall": "npm run clean && npm install", "rebuild": "npm run clean && npm install && npm run build",. Tampaknya bekerja dengan baik.
Lucas
5
Untuk windows> rd node_modules / s
Ishara Samantha
2
@Lucas Anda harus memposting ini jawaban karena itu yang paling cocok
Joseph
57

Saya menambahkan ini ke package.json saya:

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

Tampaknya bekerja dengan baik.

Lucas
sumber
2
cleanharus didefinisikan di package.json!
Ciasto piekarz
20
@Ciastopiekarz? Itu jawaban saya di atas?
Lucas
gunakan 'rm -rf node_modules' dalam kasus mesin berbasis linux, memetikan windows 'rmdir / s / q node_modules'
Mohamed.Abdo
8

Anda dapat memanfaatkan perintah 'npm cache' yang mengunduh tarball paket dan membukanya di direktori cache npm.

Sumber kemudian dapat disalin di.

Dengan menggunakan gagasan yang diperoleh dari https://groups.google.com/forum/?fromgroups=#!topic/npm-/mwLuZZkHkfU, saya membuat skrip simpul berikut. Tidak ada jaminan, YMMV, dan sebagainya.

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());
Tokek
sumber
12
Saya merasa sangat aneh bahwa fungsi dasar seperti itu, yang sebenarnya direkomendasikan oleh npm, memerlukan peretasan untuk mencapainya. Apa yang dilakukan orang lain? Abaikan saja rekomendasi dan gunakan npm install?
VitalyB
5

Dalam kata tidak .

Dalam dua, belum .

Namun, ada masalah terbuka untuk --no-buildbendera npm installuntuk melakukan instalasi tanpa bangunan, yang dapat digunakan untuk melakukan apa yang Anda minta.

Lihat masalah terbuka ini .

qubyte
sumber
4

Untuk lingkungan windows:

"scripts": {
    "clean": "rmdir /s /q node_modules",
    ...
}
Daniel De León
sumber
3

Saya telah menambahkan beberapa baris di dalam 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",
  ...
}

Jika Anda ingin cleanhanya Anda dapat menggunakan ini rimraf node_modules.

Amitesh Singh
sumber
0

Sebenarnya ada perintah khusus untuk pekerjaan ini

npm ci

Ini akan menghapus node_modulesdirektori dan akan menginstal paket-paket yang berkaitan dengan package-lock.jsonfile Anda

Info lebih lanjut: https://docs.npmjs.com/cli/ci.html

FDisk
sumber