Node.js'de kullanılmayan paketleri kaldırmak veya budamak için npm komutu


414

Tüm kullanılmayan (bildirilmemiş) bağımlılıkları bir Node.js projesinden (artık benim tanımlanmamış olanlar) kaldırmanın bir yolu var mı? package.jsonUygulamamı güncellediğimde referanssız paketlerin otomatik olarak kaldırılmasını istiyorum.


1
Ne tarafından kullanılmıyor? Klasörleri ilgili klasörden node_moduleskaldırıldıkları andan kaldırmak mı istiyorsunuz package.json?
SLaks

1
tam olarak, mhm npm ll zaten aday olan iyi bir ipucu verir.
Tarion

Yanıtlar:


670

Not : npmPaket kilitleri etkinleştirildiğinde son sürümler bunu otomatik olarak yapar, bu nedenle işaretli geliştirme paketlerini kaldırmak dışında gerekli değildir --production.


npm pruneListesinde olmayan modülleri kaldırmak için çalıştırın package.json.

Gönderen npm help prune:

Bu komut "gereksiz" paketleri kaldırır. Bir paket adı verilirse, yalnızca verilen adlardan biriyle eşleşen paketler kaldırılır.

Harici paketler, üst paketin bağımlılıklar listesinde listelenmeyen paketlerdir.

Eğer --productionbayrak belirtilmişse, bu komutu devDependencies belirtilen paketleri kaldıracaktır.


3
Bunu doğru okursam, listede yer almadığı için tüm alt bağımlılıkları kaldıracaktı package.json. Bu doğru mu? Bu nedenle, bir sonraki güncelleme veya kurulumun bunları yeniden yüklemesi gerekir.
nshew

1
Evet, alt bağımlılıkları kaldıracaktır. Alt bağımlılıklar aslında modülün kendi node_modulesdizininde saklanır , bu nedenle modülle birlikte kaldırılır.
Darkhogg

2
Bir örnek vereyim. Karma'yı benden kaldırıyorum package.json, ama bower'ı bırakıyorum. Çalıştığımda , bağımlılıklarını içeren npm prunekendi node_modulesklasörü de dahil olmak üzere tüm karmaların kaldırılmasını bekliyorum. Bower'ın bağımlılıkları hakkında (bower-json, bower-logger, chmodr, fstream, glob, vd.). Teknik olarak, bunlar benim projemde listelenmiyor package.json. Bunlar kaldırıldı mı değil mi?
nshew

3
Hayır değiller. Onlar kendi başınıza değilnode_modules , içeride node_modules/bower/node_modules , tarafından "korunuyor" olduğunu unutmayın node_modules/bower/package.json. Paketinizin ve paketinizin bağımlılıklarının bağımlılıkları karışık değildir .
Darkhogg

2
ve npm kurulumundan önce shrinkwrap'inizi silin, yukarıdaki talimatlarda bulunmalıdır.
Andy Ray

306

Bunu yapmak için birkaç dakika zaman hakkında endişeli değilseniz, bir çözüm olacaktır rm -rf node_modulesve npm installyerel modüllerini yeniden inşa etmek için tekrar basın.


93
İnsanlar yorum yapmadan bunu indirmeyi bıraksalar iyi olurdu .. kabul edilen cevaba alternatif olarak bir düğüm proje bağımlılığını sıfırlamak için geçerli bir stratejidir. Bir node_modules alt dizin içeriğine zarar verdiyseniz (sym bağlantılı bağımlılıklar ile kolay) veya düğüm veya npm sürüm tümsekleri gibi ek değişiklikleriniz varsa, budama node_modules klasörünü düzgün bir şekilde temizlemeyecektir, ancak bu cevap olacaktır.
Pyrce

41
Yeniden oluşturma node_modulesayrıca package.jsondosyanın tekrarlanabilir bir bağımlılık grafiğini tanımladığını doğrular . Kaldırma ve yeniden yükleme node_modulestemel olarak bir dağıtım testidir.
joemaller

2
@joemaller Mutlaka, çoğu dağıtım iş akışının örtülü veya açık bir şekilde bir tür önbelleği vardır. Bir paket zaten kurulmuşsa ve spesifikasyona uyuyorsa, saklanır. Kaldırıldıktan sonra yeniden yükleme, bu paket (ler) i eşleşen en son sürüme çarpacaktır.
Darkhogg

7
npm prunebir iota yardım etmedi, ama bu işe yaradı. Benim sorunum kırık bir sembolikti.
Eirik Birkeland

8
İdeal olmayan birçok durumda, şu anda npm ile mümkün değildir. Ayrıca soru kesinlikle tekrarlanan çalışma veya ek getirme konusunda bir kısıtlama belirtmedi, sadece nihai hedefe nasıl ulaşılacağı. Bu cevap, başkalarının bu hedefin ötesinde ne istediklerine rağmen belirtilen soruyu tatmin eder.
Pyrce

10

Fazla olmayan paketleri kaldırmak için npm-prune kullanabilirsiniz.

npm prune [[<@scope>/]<pkg>...] [--production] [--dry-run] [--json]

Bu komut "gereksiz" paketleri kaldırır. Bir paket adı verilirse, yalnızca verilen adlardan biriyle eşleşen paketler kaldırılır.

Harici paketler, üst paketin bağımlılıklar listesinde listelenmeyen paketlerdir.

Eğer --Üretim bayrağı belirtilmişse veya NODE_ENV ortam değişkeni ayarlandığında üretim , bu komutu belirtilen paketleri kaldıracaktır devDependencies . -No -üretim ayarı , NODE_ENV'nin üretime ayarlanmasını reddeder .

Eğer --dry işletilen bayrağı daha sonra kullanılan hiçbir değişiklik aslında yapılacaktır.

Eğer --json bayrağı kullanılırsa o değişikliği NPM kuru erik yapılan (veya yapmış olur --dry-run ) JSON nesnesi olarak basılır.

Paket kilitleri etkin durumdayken, harici modüller, modüller takıldığında otomatik olarak budanır ve yalnızca --production bayrağıyla bu komuta ihtiyacınız olur .

Paket kilitlerini devre dışı bıraktıysanız, harici modüller kaldırılmaz ve bunları kaldırmak için zaman zaman npm budama yapmak size kalmıştır .

Çoğaltmayı azaltmak için npm-dubupe kullanın

npm dedupe
npm ddp

Yerel paket ağacını arar ve bağımlılıkları ağaç üzerinde daha fazla hareket ettirerek genel yapıyı basitleştirmeye çalışır; burada birden çok bağımlı paket tarafından daha etkin bir şekilde paylaşılabilirler.

Örneğin, bu bağımlılık grafiğini düşünün:

a
+-- b <-- depends on c@1.0.x
|    `-- c@1.0.3
`-- d <-- depends on c@~1.0.9
     `-- c@1.0.10

Bu durumda, npm-dedupe ağacı:

 a
 +-- b
 +-- d
 `-- c@1.0.10

Düğümün modül aramasının hiyerarşik doğası nedeniyle, b ve d'nin her ikisinin de bağımlılıkları ağacın kök düzeyinde tek bir c paketi tarafından karşılanır.

Veri tekilleştirme algoritması ağaç üzerinde yürür ve yinelenmeler bulunmasa bile her bağımlılığı ağaçta mümkün olduğunca yukarı taşır. Bu hem düz hem de tekilleştirilmiş bir ağaçla sonuçlanacaktır.


Npm veri tekilleştirme çalıştırdıktan sonra benim node_modules klasöründe DAHA FAZLA öğe var . İç çekmek!
Neville
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.