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.