Bagaimana cara menerapkan aplikasi Node.js dengan struktur node_modules yang dalam di Windows?

91

Saya mengalami masalah yang aneh - tampaknya beberapa modul Node.js memiliki hierarki folder yang begitu dalam sehingga perintah salin Windows (atau PowerShell Copy-Itemyang sebenarnya kami gunakan) mengenai kesalahan "jalur terlalu panjang" yang terkenal ketika jalur lebih dari 250 karakter panjang.

Misalnya, ini adalah hierarki folder yang dapat dibuat oleh satu modul Node:

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

Tampaknya gila tetapi kenyataan dengan modul Node.

Kami perlu menggunakan salin-tempel selama penerapan (kami tidak menggunakan platform target yang "pintar" seperti Heroku di mana penerapan Git akan menjadi opsi) dan ini merupakan batasan serius pada Windows.

Apakah tidak ada perintah npm atau sesuatu yang akan memadatkan node_modulesfolder atau mungkin hanya menyertakan apa yang sebenarnya diperlukan saat runtime? (Modul node biasanya berisi testfolder, dll. Yang tidak perlu kita gunakan.) Adakah ide lain untuk mengatasinya? Sayangnya, tidak menggunakan Windows bukanlah pilihan :)

Borek Bernard
sumber
1
Apakah proyek Anda memiliki package.jsondengan dependenciesset? Jika demikian, dapatkah Anda menyalin tanpa node_modulesdan menggunakan npm ke installatau updatedependensi?
Jonathan Lonowski
4
@JonathanLonowski Lingkungan penerapan kami tidak mendukung eksekusi npm installdi lingkungan target, ia bekerja dengan membuat "paket penerapan" secara lokal (pada dasarnya ZIP ditambah beberapa metadata) yang kemudian diunggah ke mesin target, diekstrak di sana dan hanya itu. Jadi saya perlu memasukkan node_modulessecara langsung.
Borek Bernard

Jawaban:

24

npm v3 (dirilis baru-baru ini) memecahkan masalah ini dengan meratakan dependensi .. Periksa catatan rilis di sini di https://github.com/npm/npm/releases/tag/v3.0.0 di bawah flat flatbagian.

Dan komentar terakhir tentang masalah ini https://github.com/npm/npm/issues/3697

RameshVel
sumber
5
Catatan rilis untuk flat flatsekarang terkubur di halaman lain. Ini tautan langsungnya: github.com/npm/npm/releases/tag/v3.0.0
John-Philip
Terima kasih @ John-Philip, memperbarui jawaban dengan tautan baru
RameshVel
62

hanya untuk menambahkan ini ... hal lain yang membantu saya adalah mencantumkan semua modul yang diinstal dengan npm ls.

yang akan memberi Anda pohon modul dan versi ... dari sana cukup mudah untuk mengidentifikasi mana yang duplikat ... npm dedupetidak melakukan apa pun untuk saya. Saya tidak yakin apakah itu bug atau apa (Node v 10.16)

Jadi, setelah Anda mengidentifikasi modul duplikat, instal modul itu ke direktori root node_module dengan menggunakan npm install [email protected] --save-dev. Versi itu penting.

setelah itu, saya menghapus direktori node_modules saya dan melakukan pembaruan npm install.

Versi pendek

  1. npm ls untuk mendapatkan daftar semua modul yang terpasang.
  2. melihat-lihat modul tersebut dan mengidentifikasi modul duplikat ( versi penting )
  3. npm install module@version --save-dev untuk menginstal modul-modul tersebut di direktori root node_modules dan memperbarui package.json.
  4. rmdir node_modules untuk menghapus direktori node_modules.
  5. npm install untuk menarik salinan baru dependensi Anda.

Setelah saya melakukannya, semuanya jauh lebih bersih.

Saya juga merekomendasikan untuk mengomentari file package.json Anda untuk menunjukkan mana yang diturunkan untuk meratakan pohon node_modules.

Ben Lesh
sumber
Ini bekerja dengan baik untuk saya. Terima kasih! Maafkan ketidaktahuan saya, tetapi mengapa modul tidak selalu dipasang di tingkat atas?
Kaleb
2
@Caleb mungkin karena modul yang berbeda bergantung pada versi yang berbeda dari modul yang sama, atau mungkin hanya karena lebih mudah untuk mendapatkan apa pun yang dibutuhkan, lalu faktorkan ... Entahlah.
Ben Lesh
7
Terlepas dari itu, terima kasih atas tipnya. Saya baru saja menghapus sekitar 1700 file duplikat dari proyek kami. Menghapus sesuatu adalah bagian favorit saya menjadi seorang pengembang! Juga, bagi siapa pun yang mencari cara menambahkan komentar ke package.json, inilah jawaban Anda: stackoverflow.com/questions/14221579/…
Caleb
github.com/joyent/node/issues/6960 node guy mengatakan bahwa Windows adalah warga negara kelas satu. Mereka berkata. Tetapi mereka menutup masalah dan tidak ada perbaikan. Beruntung pengguna Windows.
vee
38

Saya tidak berpikir ada solusi bagus mengingat kendala Anda, tetapi berikut adalah beberapa hal yang dapat membantu.

  • Coba gunakan npm dedupeuntuk mengoptimalkan hierarki direktori Anda yang mungkin mempersingkat beberapa jalur
  • Gunakan npm install --productionuntuk menginstal tanpa alat pengembangan
  • Ambil beberapa dependensi yang sangat bersarang itu (cukup untuk menghindari masalah, saya sarankan) dan pindahkan ke direktori node_modules tingkat atas. Pantau saja sehingga Anda tahu mana dependensi Anda yang sebenarnya dan yang merupakan solusi untuk masalah ini.
  • ATAU pindahkan beberapa dependensi dalam tersebut ke node_modulesdirektori tertinggi di bawahnya your_project/node_modules/pkg_with_deep_depsyang akan memungkinkan mereka memiliki jalur yang cukup pendek tetapi masih berfungsi. Jadi ini akan menjadi your_project/node_modules/pkg_with_deep_deps/node_modules.
    • Saya pikir requireharus dapat menemukannya dengan benar pada saat berjalan. Anda hanya perlu mendokumentasikan dengan jelas apa yang telah Anda ubah secara manual, mengapa Anda melakukannya, dan menjaga dependensi Anda yang sebenarnya direpresentasikan secara akuratpackage.json

Berikut adalah pembahasan masalah github yang menguraikan masalah ini secara rinci.

Peter Lyons
sumber
Terima kasih telah menunjukkan dedupe(tidak tahu sama sekali) dan --production( npm install -htidak menampilkan opsi ini)! Sayangnya, menggunakan arsip ZIP bukanlah suatu pilihan, lihat komentar di atas.
Borek Bernard
9
npm dedupe hanya akan meratakan modul "umum" ke lokasi umum terendah dalam hierarki. Tidak cukup baik. Solusi yang tepat akan memungkinkan untuk "memaksa mendatar" seluruh hierarki dan mungkin memungkinkan untuk mengabaikan direktori test / doc. Alternatif bagi node untuk mendukung modul membaca langsung dari file tar.
MMind
3
Setuju, beberapa jenis distribusi paket "biner" (ZIP, tarball, apa saja) akan sangat berguna.
Borek Bernard
11

Saya menulis modul node bernama "npm-flatten" yang meratakan dependensi Anda di sini: https://www.npmjs.org/package/npm-flatten

Jika Anda mencari distrubtion, saya juga menulis paket NuGet yang akan mengintegrasikan lingkungan node.js lengkap dengan proyek .NET Anda di sini: http://www.nuget.org/packages/NodeEnv/

Umpan balik akan diterima.

pengguna3602171
sumber
Ini berhasil untuk kami. Kami mendapatkan hasil yang lebih baik saat menjalankan dedup nmp terlebih dahulu.
Shaun Rowan
1

Sesuatu yang membantu saya adalah memetakan drive lokal ke folder Node.js saya:

penggunaan bersih n: \ computername \ c $ \ users \ myname \ documents \ node.js / persistent: ya

Sebelum: c: \ users \ myname \ documents \ node.js \ projectname (45 karakter) Setelah: n: \ projectname (14 karakter, kurang dari 31 karakter)

Dalam banyak kasus, hal ini memungkinkan beberapa modul diinstal.

Saya akan mengatakan bahwa saya baru saja menemukan kembali masalah ini hari ini ketika saya mencoba mencadangkan semua kode saya ke drive USB.

"C: \ Users \ 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 \ node_modules \ file-reader \ node_modules \ expand-shallow \ benchmark \ fixture terlalu panjang. "

Bahkan ketika saya mencoba mencadangkannya menggunakan huruf drive N: masih gagal dalam beberapa kasus karena panjang jalur tetapi itu cukup untuk memperbaiki yang di atas.

Michael Blankenship
sumber
1

1) Selama rilis build, Anda dapat mencegah Visual studio memindai file / folder ini dengan mengatur properti folder sebagai folder Tersembunyi (HANYA setel ke node_modules). Referensi: http://issues.umbraco.org/issue/U4-6219#comment=67-19103

2) Anda dapat mengecualikan file atau folder yang diterbitkan selama pengemasan dengan menyertakan node XML berikut di file CsProject.

<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>
David Chelliah
sumber
1

Saya menemukan satu solusi dari Microsoft Node.js Pedoman .

  • Mulailah dengan jalur yang pendek (misalnya c: \ src)
  • > npm install -g rimraf hapus file yang melebihi max_path
  • > npm dedupe memindahkan paket duplikat ke tingkat atas
  • > npm install -g flatten-packages memindahkan semua paket ke level teratas, tetapi dapat menyebabkan masalah pembuatan versi
  • Tingkatkan ke npm@3yang mencoba membuat node_moduleshierarki folder menjadi datar maksimal.
    • Kapal dengan Node v5
    • Atau… > npm install –g npm-windows-upgrade
zangw
sumber
0

Ini bukan solusi yang tepat, melainkan solusi saat Anda sedang terburu-buru, tetapi Anda dapat menggunakan 7-Zip untuk meng - zip folder Anda, memindahkan file yang di-zip, dan mengekstraknya tanpa masalah apa pun.

Kami menggunakan solusi itu untuk menerapkan aplikasi Node.js yang tidak memungkinkan untuk melakukan pemasangan npm yang bersih.

Jason
sumber
Ya. Inilah yang saya lakukan setiap kali saya perlu menginstal luwak. Ada kode asli di dalamnya dan saya punya beberapa / versi terbaru dari Visual Studio = gagal. Saya bisa saja membuka VS, membawa setiap file .sln yang gagal dan membuatnya kembali. Tetapi lebih mudah untuk hanya melakukan XCOPY di seluruh node_modules \ mongoose folderet saya jika diperlukan (menonton versi tentu saja).
Michael Blankenship