Path file node npm windows terlalu panjang untuk menginstal paket

89

Situasi

Saya ingin menggunakan gulp dan rantai alat front-end terkait di lingkungan pengembangan yang dihosting Windows. Saya menabrak dinding mencoba menggunakan plug-in gulp seperti Browser-Sync, karena grafik folder node_modules menyebar membuat jalur file windows terlalu panjang untuk menyalin file. Saya ingin pendekatan pragmatis untuk menangani masalah ini sekarang di Windows, terlepas dari apa yang mungkin atau mungkin tidak disediakan oleh komunitas Node untuk meningkatkan kegunaan npm di Windows di masa mendatang.

2 Pertanyaan

  1. Apakah ada alur kerja npm untuk Windows yang berfungsi sebagaimana mestinya? "jalankan perintah dan file instal" (misalnya sebanding dengan npm di OSX, npm di Linux, ruby ​​gems atau bahkan nuget) Saya tidak ingin mengutak-atik banyak pengeditan file manual, symlink, dll. setiap kali saya menggunakan npm di Windows.

  2. Apakah ada alur kerja Cygwin yang terdokumentasi dengan baik dan stabil untuk eksekusi npm dan node untuk mengatasi batas jalur file Windows API?

Detail berdarah tercantum di bawah ...

Masalah Umum

  • Menjalankan npm install dari prompt perintah Windows standar gagal pada hierarki node_modules yang sangat bertingkat.
  • Menurut utas repo github Joyent, ini adalah masalah yang diakui tanpa solusi yang sesuai untuk pengembang di lingkungan yang berpusat pada Windows. ( Benarkah? )
  • Kernel NT mendukung panjang jalur file hingga 32.767 karakter.
  • MAXPATH Windows API dibatasi hingga 260 karakter.
  • Windows API menangani operasi file untuk semua shell Windows utama dan yang lainnya termasuk: Explorer, CMD, Powershell, MYSgit bash, dll. ( MS benarkah? Berapa lama NTFS sudah ada? )
  • Cygwin mendukung jalur file yang panjang, tetapi npm.cmd tidak berfungsi di luar kotak karena pemformatan crlf. Saya mencoba transformasi DOS2Unix pada npm untuk membuatnya berfungsi dengan Cygwin, tetapi tampaknya ada masalah lain dengan ini.

Peretasan Saya Saat Ini

  • Buat folder "n" sebagai area pementasan di root C: \, karena ini mempersingkat jalur folder saya.
  • Jalankan npm di dalam folder "n" untuk menginstal modul apa pun yang saya butuhkan.
  • Jalankan Cygwin dan gunakan cp untuk menyalin folder node_modules ke dalam proyek tujuan.
  • Bilas dan ulangi saat dependensi berubah atau ketika saya perlu memutar proyek baru.

Solusi Tidak Menyenangkan Lainnya

Symbolic Links dapat digunakan untuk mempersingkat jalur file, tetapi ini adalah hacks kludgy. Saat ekosistem npm tumbuh, rantai ketergantungan bersarang akan menjadi terlalu panjang dan solusi ini menjadi tidak dapat digunakan.

Menambahkan SEMUA ketergantungan ke file package.json folder root disebutkan dalam satu utas yang saya temukan. Meskipun pendekatan ini akan meratakan struktur folder dan mencegah pemuatan modul duplikat, pemecahan masalah ini terasa tidak wajar. Ini juga membunuh kegunaan, daya tahan, dan produktivitas npm, karena Anda harus mengutak-atik file dan folder pasca-instal baik secara manual atau dengan beberapa skrip hacky. Pendekatan ini juga rentan terhadap nasib yang sama yang mungkin dialami oleh pendekatan Symbolic Links.

Allan McLemore
sumber
Saya hampir berpikir saya telah menyelesaikan ini. Saya membuat Cygwin bekerja dengan npm dengan menjalankan dos2unix util pada 2 file berikut: npm.cmd dan npm
Allan McLemore
Batasan jalur Windows API membuat npm tidak dapat digunakan, karena beberapa modul npm menggunakan Visual Studio untuk membuat file. Ini adalah kesalahan yang saya terima ketika saya npm Browser-Sync: C: \ Program Files (x86) \ MSBuild \ Microsoft.Cpp \ v4.0 \ V120 \ Microsoft.CppBuild.target (301,5): kesalahan MS B3491: Bisa tidak menulis baris ke file "Rilis \ obj \ validation \ validation.tlog \ validation.lastbuilds tate". Jalur yang ditentukan, nama file, atau keduanya terlalu panjang. Nama file yang memenuhi syarat harus kurang dari 260 karakter, dan nama direktori harus kurang dari 248 karakter.
Allan McLemore
Saya mungkin memiliki pendekatan "taffy-pulling" untuk mendapatkan modul node dimuat dengan npm di windows. Ini melibatkan beberapa putaran berikut: npm install, npm dedupe, npm shrink, dan rm -r node_modules. Melakukan ini berulang kali tampaknya menghilangkan jalur file yang panjang sampai taraf tertentu, tetapi ini seperti menarik gula-gula (misalnya tidak dilakukan sampai Anda selesai). Adakah yang mengkodifikasikan ini atau menulis alat otomatis untuk membuat ini lebih siap pakai?
Allan McLemore
Berbicara tentang "skrip hacky", saya menulis satu yang menurut saya SANGAT hacky. Saya telah membuat alat yang disebut fenestrate yang dapat Anda gunakan untuk meratakan secara terprogram struktur direktori modul Anda setelah instalasi. Anda dapat menginstalnya sebagai hook postinstall npm global.
zetlen
2
@yoneal Untuk penggunaan pribadi, dan untuk memulai dengan cepat, fenestrate harus berjalan secara rekursif di folder node_modules Anda, jadi Anda tidak perlu menjalankannya secara manual pada dependensi yang dalam. Namun, akan sangat bagus untuk membagi dependensi tersebut - saya pikir banyak modul bercabang dengan konfigurasi fenestrate sederhana akan mengirim pesan yang bagus ke pengelola npm.
zetlen

Jawaban:

58

Masalah dengan folder yang sangat bersarang di Windows sebagian besar telah diselesaikan dimulai dengan versi npm 3.x.

Menurut npm:

.npm @ 3 membuat penginstalan "datar secara maksimal" dengan mengangkat semua yang ia bisa ke node_modules tingkat atas. Ini berarti bersarang hanya terjadi pada konflik dan karena itu, pohon tidak boleh terlalu dalam. Dengan demikian, batasan panjang jalur jendela tidak boleh dijalankan.

Saya baru saja menginstal npm 3.1.0dan mencobanya pada paket yang memberikan The specified path, file name, or both are too longkesalahan yang ditakuti .

Masalahnya hilang.

Anda bisa mendapatkan npm build terbaru dari sini: rilis npm

biofraktal
sumber
4
Saya juga sukses dengan pembaruan npm 3.x pada mesin Windows. Steker tak tahu malu: Saya menulis artikel tentang npm 3 di Windows triplet.fi/blog/…
Tx3
21

Windows 8.1 dan 10 memiliki opsi untuk meningkatkan batas jalur Win32:

  • Buka Editor Kebijakan Grup (Tekan Windows+ Rdan ketik gpedit.mscdan tekan Enter)
  • Arahkan ke direktori berikut: Local Computer Policy\Computer Configuration\Administrative Templates\System\Filesystem
  • Klik dua kali pada opsi Aktifkan jalur panjang Win32 dan aktifkan.

masukkan deskripsi gambar di sini

Marcelo Mason
sumber
opsi tidak tersedia untuk saya, dan fwiw, saya meningkatkan dari win 7 pro jadi itu kemungkinan penyebabnya
Evan Morrison
@EvanMorrison "Filesystem \ NTFS \ Enable NTFS long paths" diubah namanya menjadi "FileSystem \ Enable Win32 long paths" di build win10 selanjutnya. Saya memperbarui jawabannya untuk referensi di masa mendatang.
Marcelo Mason
1
ide untuk Win Server 2012 R2
sairfan
12

Ini adalah solusi penyelesaian.

Ada beberapa modul node yang meratakan dependensi Anda untuk Anda.
Tautan ada di sini:

Apa yang dilakukan modul-modul ini dapat dilakukan secara manual juga. Ini adalah satu-satunya solusi nyata yang ada saat ini, yaitu memiliki semua modul Anda pada satu tingkat, saling membutuhkan, alih-alih semua memiliki salinan pribadi dari dependensinya yang bersarang dalam.

Amol M Kulkarni
sumber
10
Saya menemukan flatten-packages untuk didokumentasikan dengan baik dan mudah digunakan.
StriplingWarrior
3

Allan -

Dari masalah github yang Anda tautkan,

npm akan menambahkan dedupe-at-install-time secara default. Ini secara signifikan lebih layak daripada perubahan sistem modul Node, tetapi ini masih tidak terlalu sepele, dan melibatkan banyak pengerjaan ulang beberapa pola yang sudah lama tertanam.

Ini (akhirnya) saat ini sedang dikerjakan di npm, sesuai namanya multi-stage-install, dan ditargetkan untuk npm@3. npmpimpinan pengembangan Forrest Norvell akan menghabiskan beberapa waktu untuk menjalankan Windows di tahun baru, jadi harap buat masalah yang berhubungan dengan windows di npmpelacak masalah < https://github.com/npm/npm/issues >

Sam Mikes
sumber
3

Saya memiliki masalah yang sama. Meratakan dependensi bukanlah solusi lengkap, karena Anda mungkin menggunakan modul yang bergantung pada versi berbeda dari modul dependen yang sama. Saya menemukan modul gulp-run berhenti berfungsi setelah diratakan (terkait dengan asumsi modul tentang direktori bin / .bin, saya curiga). Drat!

Ada banyak diskusi tentang masalah ini, tetapi tidak ada solusi yang terlihat: https://github.com/joyent/node/issues/6960

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

Solusi yang berhasil untuk saya adalah dengan menambahkan dependensi yang tidak secara eksplisit diperlukan oleh proyek saya.

Jika Anda ingin mengidentifikasi paket mana yang memberi Anda masalah, saya menemukan PathLengthChecker cukup berguna. Cukup ekstrak EXE dan jalankan GUI atau aplikasi baris perintah. Cara lain saya menemukan masalah adalah mencoba membangun di Visual Studio, tetapi gagal tanpa memberi tahu Anda nama direktori mana yang terlalu panjang.

Berikut adalah contoh baris perintah dari solusi saya:

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

Saya kembali:

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-url \ node_modules \ npmconf \ node_modules \ npmconf config-chain \ readme.markdown

[snip - ada 12 dari mereka]

Menurut perintah npm ls :

└─┬ 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

Mari kita gunakan npmconf - ini adalah wadah untuk semua file yang terlalu panjang yang menyebabkan masalah. Kami membutuhkan npmconf 2.1.1.

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

Tidak ada hasil - semua file masih dalam batas!

Peringatan yang jelas di sini adalah bahwa ini hanya bekerja sekali per paket - ketergantungan pada versi berbeda dari modul yang sama tidak dapat diinstal pada tingkat root node_modules karena node tidak memperhitungkan versi dalam struktur direktori.

Solusi ini tidak sempurna, tetapi menyelesaikan tujuan utama saya untuk memiliki node yang berfungsi di Windows, dan karena resolusinya tepat di package.json, solusi tersebut berfungsi untuk pengembang lain dan membangun server tanpa masalah manual atau global.

Stefan Mohr
sumber
2

Jika Anda tidak keberatan menginstalnya secara global, ini bisa menjadi solusi:

Anda dapat menyesuaikan jalur di mana npm menginstal modul global menjadi sesuatu yang sangat singkat (biasanya:) c:\users\\{username}\AppData\Roaming\npm\npm_modulesyang sudah membutuhkan banyak karakter.

Untuk menyesuaikannya lihat di sini: Ubah direktori instalasi global default untuk modul node.js di Windows?

Jika Anda menyesuaikannya, misalnya, c:\n\dalam beberapa kasus, ini mungkin menyelesaikan masalah.

gwildu
sumber
1

Inilah yang akhirnya memperbaikinya untuk saya ...

Setelah menginstal gulp dan menerima kesalahan, jalankan ... gulp

Saat Anda melihat paket gagal, instal secara manual dengan --no-bin-link.

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

Di mana {package} adalah paket yang mengalami masalah.

Setelah semua ini saya menerima pesan Kesalahan dalam plugin 'gulp-notify' Pesan: tidak ditemukan: notify-send.

Ini karena masalah plugin dengan Vagrant. Anda bisa mematikan notifikasi ..

export DISABLE_NOTIFIER=true;

Atau instal plugin dengan Vagrant .

Semoga berhasil .. Saya menghabiskan waktu lama untuk ini, bahkan setelah mengikuti rekomendasi banyak orang.

Brandon

pengguna3310182
sumber
0

Di windows:

  1. Menggunakan windows explorer Anda, Arahkan ke folder bersama gelandangan Anda (saya menggunakan scotchbox) misalnya C:\scotchbox/public/gulpProject
  2. Di bilah alamat folder, ketik cmddan tekanEnter
  3. Lakukan instalasi gulp Anda npm install
Justis Matotoka
sumber
1
Hindari menyalin-tempel jawaban yang sama . Anda harus menandai sebagai duplikat. Selain itu, jangan mengumpat pada postingan Anda.
Tunaki
0

npm install --no-bin-link. Anda akan mendapatkan seluruh pipih node_modules

kenberkeley
sumber