Windows üzerinde derin node_modules yapısıyla Node.js uygulaması nasıl dağıtılır?


91

Meraklı bir sorunla karşılaştım - görünüşe göre bazı Node.js modüllerinde o kadar derin klasör hiyerarşileri var ki, Windows kopyalama komutu (veya Copy-Itemaslında kullandığımız PowerShell ), yol 250'nin üzerinde olduğunda rezil "yol çok uzun" hatasına çarpıyor uzun karakter.

Örneğin, bu, tek bir Düğüm modülünün oluşturabileceği bir klasör hiyerarşisidir:

node_modules\nodemailer\node_modules\simplesmtp\node_modules\
xoauth2\node_modules\request\node_modules\form-data\node_modules\
combined-stream\node_modules\delayed-stream\...

Çılgınca görünüyor ama Düğüm modülleri ile bir gerçektir.

Dağıtım sırasında kopyala-yapıştır kullanmalıyız (Git dağıtımının bir seçenek olacağı Heroku gibi "akıllı" bir hedef platform kullanmıyoruz) ve bu Windows için ciddi bir sınırlamadır.

node_modulesKlasörü sıkıştıracak bir npm komutu veya başka bir şey yok mu veya belki sadece çalışma zamanında gerçekten gerekli olanı içermez mi? (Düğüm modülleri genellikle testdağıtmamız gerekmeyen klasörler vb. İçerir.) Bu konuda nasıl çalışılacağı hakkında başka fikriniz var mı? Windows kullanmamak maalesef bir seçenek değil :)


1
Projeniz bir var mı package.jsonile dependenciessette? Eğer öyleyse, node_modulesnpm'yi installveya updatebağımlılıkları olmadan kopyalayıp kullanabilir misiniz ?
Jonathan Lonowski

4
@JonathanLonowski Dağıtım ortamımız npm install, hedef ortamda yürütmeyi desteklemiyor , yerel olarak bir "dağıtım paketi" (temelde bir ZIP artı bazı meta veriler) oluşturarak çalışır ve bu daha sonra hedef makineye yüklenir, orada çıkarılır ve hepsi bu kadar. Bu yüzden node_modulesdoğrudan eklemem gerekiyor .
Borek Bernard

Yanıtlar:


24

npm v3 (son zamanlarda yayımlanan) .. bağımlılıkları dışarı düzleştirme bu sorunu çözer burada sürüm notlarını kontrol https://github.com/npm/npm/releases/tag/v3.0.0 altında flat flatbölümüne.

Ve bu konudaki son yorum https://github.com/npm/npm/issues/3697


5
İçin sürüm notları flat flatartık başka bir sayfada gömülü. İşte doğrudan bağlantı: github.com/npm/npm/releases/tag/v3.0.0
John-Philip

Teşekkürler @ John-Philip, yanıtı yeni bağlantıyla güncelledi
RameshVel

62

sadece buna eklemek için ... bana yardımcı olan başka bir şey, yüklü tüm modülleri listelemekti npm ls.

bu size bir modül ve sürüm ağacı verecektir ... buradan hangilerinin yinelenen olduğunu belirlemek oldukça kolaydır ... npm dedupebenim için hiçbir şey yapmadı. Bunun bir hata olup olmadığından emin değilim (Node v 10.16)

Dolayısıyla, yinelenen bir modülü belirlediğinizde, bunu kullanarak kök düğüm_module dizinine kurun npm install dupemodule@1.2.3 --save-dev. Versiyon önemlidir.

bundan sonra node_modules dizinimi sildim ve yeni bir npm install.

Kısa versiyon

  1. npm ls kurulu tüm modüllerin bir listesini almak için.
  2. bu modülleri inceleyin ve yinelenen modülleri belirleyin ( sürüm önemlidir )
  3. npm install module@version --save-dev bu modülleri kök node_modules dizinine kurmak ve package.json'u güncellemek için.
  4. rmdir node_modules node_modules dizinini silmek için.
  5. npm install bağımlılıklarınızın yeni bir kopyasını aşağı çekmek için.

Bunu yaptıktan sonra her şey çok daha temizdi.

Ayrıca node_modules ağacını düzleştirmek için hangilerinin indirildiğini göstermek için package.json dosyanızı yorumlamanızı öneririm.


Bu benim için harika çalıştı. Teşekkür ederim! Cehaletimi bağışlayın, ama neden modüller her zaman en üst seviyede kurulmuyor?
Caleb

2
@Caleb muhtemelen farklı modüller aynı modülün farklı sürümlerine dayandığı için ya da sadece ihtiyaç duyulan şeyi elde etmenin daha kolay olduğu için, sonra onu azaltın ...
Ben Lesh

7
Her şeye rağmen, bahşiş için teşekkürler. Az önce projemizden yaklaşık 1700 kopya dosya çıkardım. Bir şeyleri silmek, geliştirici olmanın en sevdiğim yanı! Ayrıca, package.json'a nasıl yorum ekleneceğini arayanlar için cevabınız: stackoverflow.com/questions/14221579/…
Caleb

github.com/joyent/node/issues/6960 node guy, Windows'un birinci sınıf vatandaş olduğunu söylüyor. Dediler. Ancak sorunu kapattılar ve hiçbir şey düzeltilmedi. Şanslı Windows kullanıcıları.
vee

38

Kısıtlamalarınıza göre harika bir çözüm olduğunu sanmıyorum, ancak işte size yardımcı olabilecek bazı şeyler.

  • npm dedupeDizin hiyerarşinizi optimize etmek için kullanmayı deneyin , bu da bazı yolları kısaltabilir
  • npm install --productionGeliştirme araçları olmadan yüklemek için kullanın
  • Bu derinlemesine iç içe geçmiş bağımlılıklardan bazılarını alın (sorundan kaçınmaya yetecek kadar) ve bunları en üst düzey node_modules dizinine taşıyın. Bunları takip edin, böylece hangilerinin gerçek bağımlılıklarınız olduğunu ve hangilerinin bu sorun için geçici çözümler olduğunu bilirsiniz.
  • VEYA bu derin bağımlılıklardan bazılarını, node_modulesaltındaki en yüksek dizine taşıyın, your_project/node_modules/pkg_with_deep_depsyeterince kısa yollara sahip olmalarına rağmen yine de çalışmaya devam etmelerini sağlar. Yani bu olur your_project/node_modules/pkg_with_deep_deps/node_modules.
    • Bence requirebunları çalışma zamanında düzgün bir şekilde bulabilmeliyiz. Sadece manuel olarak neyi değiştirdiğinizi, bunu neden yaptığınızı açıkça belgelemeniz ve kendi gerçek bağımlılıklarınızın doğru şekilde temsil edilmesini sağlamanız gerekecek.package.json

İşte bu sorunu ayrıntılı olarak ele alan bir github sorunu tartışması .


İşaret dedupeettiğiniz için teşekkürler (bunu hiç bilmiyordum) ve --production( npm install -hbu seçeneği göstermedi)! Bir ZIP arşivi kullanmak maalesef bir seçenek değil, yukarıdaki yoruma bakın.
Borek Bernard

9
npm tekilleştirme, "ortak" modülleri hiyerarşideki en düşük ortak konuma düzleştirir. Yeterince iyi değil. Uygun bir çözüm, tüm hiyerarşiyi "zorlamaya" izin verir ve muhtemelen test / doc dizinlerinin göz ardı edilmesine izin verir. Bir alternatif, düğümün modülleri doğrudan bir tar dosyasından okumayı desteklemesi olabilir.
MMind

3
Kabul edildi, paketlerin bir tür "ikili" dağıtımı (ZIP, tarball, her neyse) çok faydalı olacaktır.
Borek Bernard

11

Bağımlılıklarınızı sizin için düzleştiren "npm-flatten" adlı bir düğüm modülü yazdım: https://www.npmjs.org/package/npm-flatten

Bir dağıtım arıyorsanız, burada .NET projenizle eksiksiz bir node.js ortamını entegre edecek bir NuGet paketi yazdım: http://www.nuget.org/packages/NodeEnv/

Geri bildirim memnuniyetle karşılanacaktır.


Bu bizim için çalıştı. İlk olarak nmp tekilleştirmeyi çalıştırdığımızda daha da iyi sonuçlar elde ettik.
Shaun Rowan

1

Bana yardımcı olan bir şey, yerel bir sürücüyü Node.js klasörüme eşlemekti:

net kullanım n: \ bilgisayaradı \ c $ \ kullanıcılar \ myname \ belgeler \ node.js / kalıcı: evet

Önce: c: \ users \ myname \ belgeler \ node.js \ projeadı (45 karakter) Sonra: n: \ projeadı (31 karakter daha az olan 14 karakter)

Çoğu durumda bu, bazı modüllerin kurulmasına izin verdi.

Bugün tüm kodumu bir USB sürücüsüne yedeklemeye çalışırken bu sorunu yeni keşfettiğimi söyleyeceğim.

"C: \ Kullanıcılar \ myname \ Documents \ Node.js \ angular-phonecat \ node_modules \ karma \ node_modules \ chokidar \ node_modules \ anymatch \ node_modules \ micromatch \ node_modules \ regex-cache \ node_modules \ benchmarked \ nodemodules \ node_modules \ node_modules \ ext-sığ \ benchmark \ fikstürleri çok uzun. "

Bunları N: sürücü harfini kullanarak yedeklemeye çalıştığımda bile, bazı durumlarda yol uzunlukları nedeniyle hala başarısız oldu, ancak yukarıdakini düzeltmek için yeterliydi.


1

1) Sürüm oluşturma sırasında, klasör özelliklerini Gizli klasör olarak ayarlayarak Visual Studio'nun bu dosyaları / klasörleri taramasını önleyebilirsiniz (SADECE onu düğüm_modülleri olarak ayarlayın). Referans: http://issues.umbraco.org/issue/U4-6219#comment=67-19103

2) Aşağıdaki XML düğümünü CsProject dosyasına ekleyerek paketleme sırasında yayınlanan dosyaları veya klasörleri hariç tutabilirsiniz.

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
  ...
  <OutputPath>bin\</OutputPath>
   <NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>
  <ExcludeFilesFromDeployment>File1.aspx;File2.aspx</ExcludeFilesFromDeployment>
  <ExcludeFoldersFromDeployment>Folder1;Folder2</ExcludeFoldersFromDeployment>
</PropertyGroup>

1

Microsoft Node.js Yönergelerinden bir çözüm buldum .

  • Kısa bir yoldan başlayın (örneğin c: \ src)
  • > npm install -g rimraf aşan dosyaları sil max_path
  • > npm dedupe yinelenen paketleri en üst seviyeye taşır
  • > npm install -g flatten-packages tüm paketleri en üst seviyeye taşır, ancak sürüm oluşturma sorunlarına neden olabilir
  • Klasör hiyerarşisini en üst düzeyde düz npm@3hale getirme girişimlerini yükseltin node_modules.
    • Düğüm v5 ile birlikte gönderilir
    • Veya… > npm install –g npm-windows-upgrade

0

Bu uygun bir çözüm değil, aceleniz olduğunda geçici bir çözümdür, ancak klasörünüzü sıkıştırmak, sıkıştırılmış dosyayı taşımak ve herhangi bir sorun olmadan sıkıştırmak için 7-Zip'i kullanabilirsiniz .

Bu çözümü, temiz bir npm kurulumu yapmanın mümkün olmadığı bir Node.js uygulamasını dağıtmak için kullandık.


Evet. Firavun faresini her kurmam gerektiğinde yaptığım şey bu. İçinde yerel kod var ve Visual Studio'nun birden çok / yeni sürümü var = fail. VS'yi açıp, başarısız olan her .sln dosyasını getirip yeniden oluşturabilirdim. Ancak, gerektiği gibi tüm node_modules \ mongoose klasör setim üzerinde yalnızca XCOPY yapmak daha kolay (tabii ki sürümleri izlemek).
Michael Blankenship
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.