Düğüm npm windows dosya yolları, paketleri yüklemek için çok uzun


89

Durum

Windows tarafından barındırılan geliştirme ortamlarında gulp ve ilgili ön uç araç zincirlerini kullanmak istiyorum. Browser-Sync gibi gulp eklentilerini kullanmaya çalışan bir duvara çarpıyorum, çünkü node_modules klasör grafiği, Windows dosya yollarını dosyaları kopyalamak için çok uzun hale getiriyor. Node topluluğunun gelecekte Windows'ta npm kullanılabilirliğini iyileştirmek için ne sağlayıp sağlayamayacağına bakılmaksızın, şu anda Windows'ta bu sorunu çözmek için pragmatik bir yaklaşım istiyorum.

2 Soru

  1. Windows için tam olarak tasarlandığı şekilde çalışan bir npm iş akışı var mı? "komutu çalıştır ve dosyaları yükle" (ör. OSX'te npm, Linux'ta npm, ruby ​​gems ve hatta nuget ile karşılaştırılabilir) Her kullandığımda bir sürü manuel dosya düzenlemesi, sembolik bağ vb. ile uğraşmak istemiyorum Windows'ta npm.

  2. Windows API dosya yolu sınırlarını geçici olarak çözmek için npm ve düğüm yürütme için iyi belgelenmiş, kararlı bir Cygwin iş akışı var mı?

Aşağıda listelenen kanlı detaylar ...

Genel Problem

  • Standart bir Windows komut isteminden npm yüklemesini çalıştırmak, derinlemesine iç içe geçmiş düğüm_ modülleri hiyerarşilerinde başarısız olur.
  • Joyent'in github repo iş parçacığına göre, bu, Windows merkezli ortamlardaki geliştiriciler için makul bir geçici çözüm içermeyen kabul edilmiş bir sorundur . ( Gerçekten mi? )
  • NT Kernel, 32.767 karaktere kadar dosya yolu uzunluklarını destekler.
  • Windows API'nin MAXPATH'i 260 karakterle sınırlıdır.
  • Windows API, tüm büyük Windows kabukları için dosya işlemlerini yürütür ve aşağıdakiler dahil değildir: Explorer, CMD, Powershell, MYSgit bash, vb. ( MS gerçekten? NTFS ne zamandır var? )
  • Cygwin uzun dosya yollarını destekler, ancak npm.cmd, crlf biçimlendirmesi nedeniyle kullanıma hazır olarak çalışmaz. Cygwin ile çalışmasını sağlamak için DOS2Unix dönüşümünü npm'de denedim, ancak bununla ilgili başka sorunlar var gibi görünüyor.

Mevcut Hack'im

  • Klasör yolumu kısalttığından, C: \ kökünde hazırlama alanı olarak bir "n" klasörü oluşturun.
  • İhtiyacım olan şey için modülleri yüklemek için "n" klasörünün içinde npm'yi çalıştırın.
  • Cygwin'i çalıştırın ve node_modules klasörünü bir hedef projeye kopyalamak için cp'yi kullanın.
  • Bağımlılıklar değiştiğinde veya yeni bir proje başlatmam gerektiğinde durulayın ve tekrarlayın.

Diğer Tatsız Çözümler

Dosya yollarını kısaltmak için Sembolik Bağlantılar kullanılabilir, ancak bunlar kludgy korsanlarıdır. Npm ekosistemi büyüdükçe, iç içe geçmiş bağımlılık zincirleri çok uzar ve bu geçici çözüm kullanılamaz hale gelir.

TÜM bağımlılıkları kök klasörün package.json dosyasına eklemek , karşılaştığım bir iş parçacığında bahsedildi. Bu yaklaşım klasör yapısını düzleştirecek ve yinelenen modüllerin yüklenmesini engelleyecek olsa da, bu geçici çözüm doğal görünmüyor. Aynı zamanda npm'nin kullanılabilirliğini, dayanıklılığını ve üretkenliğini de öldürür, çünkü yükleme sonrası dosyalar ve klasörlerle ya elle ya da bazı hacky komut dosyalarıyla uğraşmanız gerekir. Yaklaşım aynı zamanda Sembolik Bağlantılar yaklaşımının sonunda zarar görebileceği aynı kadere karşı savunmasızdır.


Neredeyse bunu çözdüğümü düşünüyordum. Aşağıdaki 2 dosyada dos2unix util'i çalıştırarak Cygwin'i npm ile çalıştırdım: npm.cmd ve npm
Allan McLemore

Windows API yolu sınırlamaları, bazı npm modülleri dosya oluşturmak için Visual Studio kullandığından npm'yi kullanılamaz hale getirir. Bu npm Browser-Sync: C: \ Program Files (x86) \ MSBuild \ Microsoft.Cpp \ v4.0 \ V120 \ Microsoft.CppBuild.targets (301,5): MS B3491 hatası: Could satırları "Release \ obj \ validation \ validation.tlog \ validation.lastbuilds tate" dosyasına yazmayın. Belirtilen yol, dosya adı veya her ikisi de çok uzun. Tam nitelikli dosya adı 260 karakterden az olmalı ve dizin adı 248 karakterden az olmalıdır.
Allan McLemore

Windows'ta npm ile yüklenmiş düğüm modüllerini almak için "şekerleme çekme" yaklaşımım olabilir. Aşağıdakilerin birkaç turunu içerir: npm yükleme, npm tekilleştirme, npm küçültme ve rm -r düğüm_modülleri. Bunu tekrar tekrar yapmak, uzun dosya yollarını bir dereceye kadar ortadan kaldırıyor gibi görünür, ancak bu bir çeşit şekerleme çekmeye benzer (örneğin, işiniz bitene kadar yapılmaz). Bunu daha anahtar teslimi yapmak için bunu kodlayan veya otomatik bir araç yazan var mı?
Allan McLemore

"Hacky komut dosyalarından" bahsetmişken, KORKUNÇ düzmece bulmadığım bir tane yazdım. Kurulumdan sonra modüllerinizin dizin yapısını programlı olarak düzleştirmek için kullanabileceğiniz fenestrate adlı bir araç oluşturdum . Bunu genel bir npm kurulum sonrası kancası olarak kurabilirsiniz.
zetlen

2
@yoneal Kişisel kullanım için ve hızlı bir şekilde başlamak için fenestrate, node_modules klasörünüzde yinelemeli olarak gezinmelidir, böylece derin bağımlılıklarda manuel olarak çalıştırmanıza gerek kalmaz. Ancak, bu bağımlılıkları çatallamak harika olurdu - basit fenestrate yapılandırmalarına sahip birçok çatallı modülün npm bakımcılarına harika bir mesaj göndereceğini düşünüyorum.
zetlen

Yanıtlar:


58

Windows'ta derinlemesine iç içe geçmiş klasörlerle ilgili sorun çoğunlukla npm sürümünden başlayarak çözüldü 3.x.

Npm'ye göre:

.npm @ 3, yapabildiği her şeyi en üst düzey node_modules'e kaldırarak kurulumu "en üst düzeyde düz" hale getirir. Bu, yuvalanmanın yalnızca çatışmalarda meydana geldiği ve bu nedenle ağaçların asla çok derinleşmemesi gerektiği anlamına gelir. Bu nedenle, Windows yol uzunluğu sınırlamasına girilmemelidir.

Npm'yi yeni yükledim 3.1.0ve korkunç The specified path, file name, or both are too longhatayı atan bir pakette denedim .

Sorun ortadan kalktı.

En son npm derlemelerini buradan edinebilirsiniz: npm sürümleri


4
Windows makinede npm 3.x güncellemesinde de başarılı oldum. Utanmaz eklenti: Windows triplet.fi/blog/…
Tx3

22

Windows 8.1 ve 10, Win32 yol sınırını artırma seçeneğine sahiptir:

  • Grup İlkesi Düzenleyicisini Aç ( Windows+ tuşuna basın Rve yazın gpedit.mscve vurun Enter)
  • Aşağıdaki dizine gidin: Local Computer Policy\Computer Configuration\Administrative Templates\System\Filesystem
  • DoubleClick üzerinde Win32 uzun yolları etkinleştir seçeneğini ve etkinleştirin.

görüntü açıklamasını buraya girin


seçenek benim için mevcut değildi ve FWIW, ben olası bir nedeni var kazanmak 7 Pro bu kadar yükseltme
Evan Morrison

@EvanMorrison "Filesystem \ NTFS \ Enable NTFS long paths", sonraki win10 sürümlerinde "FileSystem \ Enable Win32 uzun yollarını" olarak yeniden adlandırıldı. Cevabı ileride başvurmak üzere güncelledim.
Marcelo Mason

1
Win Server 2012 R2 için bir fikrin
sairfan

12

Bu bir çözüm etrafında bir çözümdür.

Bağımlılıklarınızı sizin için düzleştiren bazı düğüm modülleri var.
Bağlantılar burada:

Bu modüllerin yaptığı şey manuel olarak da yapılabilir. Şu an için mevcut olan tek gerçek çözüm budur, yani tüm modüllerinizin tek bir seviyede olması, bağımlılıklarının özel kopyalarının derinlemesine iç içe geçmiş olması yerine birbirini gerektirmesidir.


10
Yassılaştırma paketlerinin iyi belgelenmiş ve kullanımının kolay olduğunu gördüm .
StriplingWarrior

3

Allan ...

Bağladığınız github sorunundan,

npm, varsayılan olarak yükleme sırasında tekilleştirmeyi ekler. Bu, Node'un modül sisteminin değiştirilmesinden önemli ölçüde daha uygundur, ancak yine de tam olarak önemsiz değildir ve bazı uzun süredir yerleşik olan modellerin çok sayıda yeniden çalışmasını içerir.

Bu (nihayet) şu anda npm'deki çalışmalarda, ismine göre gidiyor multi-stage-installve hedefleniyor npm@3. npmgeliştirme lideri Forrest Norvell, yeni yılda Windows üzerinde çalışmak için biraz zaman harcayacak, bu nedenle lütfen npmsorun izleyicide < https://github.com/npm/npm/issues > pencerelerle ilgili sorunlar oluşturun


3

Bende de aynı sorun var. Aynı bağımlı modülün farklı sürümlerine bağlı modüller kullanıyor olabileceğinizden, bağımlılıkları düzleştirmek tam bir çözüm değildir. Düzleştirmeden sonra gulp-run modülünün çalışmayı durdurduğunu keşfettim (bin / .bin dizinleri hakkındaki modül varsayımlarıyla ilgili, sanıyorum). Kahretsin!

Sorunla ilgili pek çok tartışma var ama görünürde çözüm yok: https://github.com/joyent/node/issues/6960

https://github.com/npm/npm/issues/3697

Benim için çalışan bir geçici çözüm, projemin açıkça ihtiyaç duymadığı bağımlılıkları manuel olarak eklemektir.

Hangi paketlerin size sorun çıkardığını belirlemek istiyorsanız, PathLengthChecker'ı oldukça yararlı buldum . Sadece EXE dosyasını çıkarın ve GUI veya komut satırı uygulamasını çalıştırın. Sorunu ortaya çıkardığım diğer bir yol, Visual Studio'da derlemeyi denemek, ancak hangi dizin adının çok uzun olduğunu size söylemeden başarısız oluyor .

İşte çözümümün bir komut satırı örneği:

mkdir c:\reallylongdirectorywillbreakinwindows
cd c:\reallylongdirectorywillbreakinwindows
npm init
npm install --save-dev grunt-bower-task
PathLengthChecker.exe RootDirectory="C:\reallylongdirectorywillbreakinwindows" MinLength=260

Geri aldım:

261: C: \ reallylongdirectorywillbreakinwindows \ node_modules \ grunt-bower-task \ node_modules \ bower \ node_modules \ update-notifier \ node_modules \ latest-version \ node_modules \ package-json \ no de_modules \ registry-urules \ node_modules \ node_modules \ config-chain \ readme.markdown

[sniper - 12 tane vardı]

Göre npm ls komutu:

└─┬ grunt-bower-task@0.4.0
  ├── async@0.1.22
  ├─┬ bower@1.3.12
  │ ├─┬ update-notifier@0.2.0
  │ │ ├─┬ latest-version@0.2.0
  │ │ │ └─┬ package-json@0.2.0
  │ │ │   └─┬ registry-url@0.1.1
  │ │ │     └─┬ npmconf@2.1.1
  │ │ │       ├─┬ once@1.3.1
  │ │ │       │ └── wrappy@1.0.1

Hadi npmconf ile gidelim - sorunlara neden olan tüm aşırı uzunluktaki dosyalar için kapsayıcıdır. Npmconf 2.1.1'e ihtiyacımız var.

npm install --save-dev npmconf@2.1.1
(now delete the node_modules directory - you may have to use Windows Explorer if you can't do it with rmdir /s)
npm install
PathLengthChecker.exe RootDirectory="C:\reallylongdirectorywillbreakinwindows" MinLength=260

Sonuç yok - tüm dosyalar sınırlar dahilinde!

Buradaki bariz uyarı, paket başına yalnızca bir kez çalışmasıdır - aynı modülün farklı sürümlerine bağımlılıklar, kök düğüm_modülleri düzeyinde kurulamaz çünkü düğüm, dizin yapısındaki sürümleri hesaba katmaz.

Bu geçici çözüm mükemmel değil, ancak Windows üzerinde düğüm çalışması yapma ana hedeflerimi çözüyor ve çözüm package.json'da doğru olduğundan, geçici çözüm diğer geliştiriciler için çalışıyor ve herhangi bir manuel veya küresel karışıklık olmadan sunucular oluşturuyor.



1

Sonunda benim için düzelten şey buydu ...

Yutkuyu yükledikten ve hataları aldıktan sonra, şunu çalıştırın ... gulp

Bir paketin başarısız olduğunu gördüğünüzde, manuel olarak yükleyin --no-bin-link.

sudo npm install {package} --no-bin-link

{Package} sorunlu pakettir.

Tüm bunlardan sonra 'gulp-notify' eklentisinde bir Hata alıyordum Mesaj: bulunamadı: notify-send.

Bu, Vagrant'taki bir eklenti sorunundan kaynaklanıyordu. Ya bildirimleri kapatabilirsiniz ..

export DISABLE_NOTIFIER=true;

Veya eklentiyi Vagrant ile kurun .

Bol şans .. Pek çok insanın tavsiyesine uyduktan sonra bile bunun üzerinde uzun zaman geçirdim.

Brandon


0

Windows'ta:

  1. Windows gezgini kullanarak, serseri paylaşımlı klasörünüze gidin (bu arada scotchbox kullanıyorum) örn. C:\scotchbox/public/gulpProject
  2. Klasörün adres çubuğuna yazın cmdve tuşuna basın.Enter
  3. Yudum kurulumunuzu yapın npm install

1
Aynı cevabı kopyalayıp yapıştırmaktan kaçının . Bunun yerine yinelenen olarak işaretlemelisiniz. Ek olarak, gönderinizde küfür etmeyin.
Tunaki

0

npm install --no-bin-link. Tamamen düzleşmiş olacaksın 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.