NPM temiz modüller


144

Node_modules altındaki tüm modülleri oluşturmak için npm almanın bir yolu var mı? Tüm yapı yapılarını kaldıran ancak bunları yeniden oluşturmayan npm rebuild gibi bir şey mi?


4
Hiç sormayacaksın sandım. Önerildiği gibi GİT'e benim node_modules dizinini kontrol ettim mikealrogers.com/posts/nodemodules-in-git.html . Yeni bir modül eklediğimde veya güncel bir modülü güncellediğimde git'te gitmemesi gereken yapı artefaktlarıyla karşılaşıyorum ve onları temizlemek zorundayım. İlk önce onları temizleyebilseydim, süreç biraz daha sorunsuz gidecekti.
Dave Causey

1
Hızlı bir not: Artık NPM desteklediğine göre shrinkwrap(bkz. Npmjs.org/doc/shrinkwrap.html ), TÜM bağımlılıklarınızın sürümlerini kilitleyebilirsiniz (yalnızca en üst düzey olanlar yerine).
Michelle Tilley

2
Bu özelliğe sahip olmama platformlar arası geliştirme için de berbat. Mac üzerinde geliştiririz ve Linux'ta CI çalıştırırız ve bir ton zaman harcayan Linux'ta her derleme yaptığımızda node_modules dizinini kaldırıp tamamen yeniden yüklememiz gerekir.
JBCP

4
@JBCP yanlış yapıyorsunuz. Yapmanız gereken, modülleri kurmak packages.json(kullanmak npm --save) ve node_modulesdizini koymak .gitignore( git kullanılıyorsa ). CI düğümü_modüllerinizi çekmemeli, çalıştırmalıdır npm install. Son olarak, npm kayıt defterinden indirme işlemi çok uzun sürerse , önbelleklemek için sinopi gibi bir şey kullanın .
Bojan Markovic

1
@BojanMarkovic - Haklısın, projelerimiz şu anda böyle kuruluyor. Yukarıdaki yorumum yaklaşık bir yıl önceydi. Git'e node_modules yapılmasını öneren birkaç proje vardı, ama bu kesinlikle doğru değil.
JBCP

Yanıtlar:


160

Sadece node_module dizinini silebilirsiniz

rm -rf node_modules/

15
Bu, düğüm_modüllerinin kaynağını ve derlenmiş çıktıyı kaldıracaktır, bu nedenle soruyu cevaplamamaktadır.
theGecko

Eğer npm bağlantısı ile bağlantılı bağımlılık varsa, aynı zamanda oldukça acı verici olabilir kaynak dizinindeki bu modülleri kaynağı silebilir ...
cschuff

12
Kız kardeşime karşı bu ekledi package.json: "clean": "rm -rf node_modules", "reinstall": "npm run clean && npm install", "rebuild": "npm run clean && npm install && npm run build",. İyi çalışıyor gibi görünüyor.
Lucas

5
Pencereler için> rd node_modules / s
Ishara Samantha

2
@Lucas bunu en uygun olanı olarak bir cevap göndermelisin
Joseph

57

Bunu paketime ekledim. Json:

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

İyi çalışıyor gibi görünüyor.


2
cleanpackage.json içinde tanımlanmalıdır!
Ciasto piekarz

20
@Ciastopiekarz? Cevabım yukarıda söylediğim bu mu?
Lucas

linux tabanlı makinede 'rm -rf node_modules' kullanın, pencereler 'rmdir / s / q node_modules' durumunda
Mohamed.Abdo

Bunları kullanmak için, temiz npm'de kabul edilen isimlerden biri olmadığından "npm clean" diyemezsiniz. "Temiz npm çalışma" yapmanız gerekir.
PCoelho

8

Paket tarball'ı indirip npm önbellek dizinine açan 'npm cache' komutundan faydalanabilirsiniz.

Daha sonra kaynak kopyalanabilir.

Https://groups.google.com/forum/?fromgroups=#!topic/npm-/mwLuZZkHkfU adresinden alınan fikirleri kullanarak aşağıdaki düğüm komut dosyasını buldum. Hiçbir garanti, YMMV, vb.

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
Aslında npm tarafından önerilen böyle bir temel işlevsellik elde etmek için bir kesmek gerektirir çok garip buluyorum. Diğer herkes ne yapıyor? Sadece öneriyi dikkate almayın ve kullanın npm install?
VitalyB

5

Tek kelimeyle hayır .

İkincisi, henüz değil .

Bununla birlikte, bir --no-buildbayrağın npm installyapmadan kurulum yapması için sorduğunuz şeyi yapmak için kullanılabilecek açık bir sorun vardır .

Bu açık konuya bakın .




3

Package.json içine birkaç satır ekledim:

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

Eğer cleansadece isterseniz bunu kullanabilirsiniz rimraf node_modules.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.