Saya mengalami masalah yang aneh - tampaknya beberapa modul Node.js memiliki hierarki folder yang begitu dalam sehingga perintah salin Windows (atau PowerShell Copy-Item
yang 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_modules
folder atau mungkin hanya menyertakan apa yang sebenarnya diperlukan saat runtime? (Modul node biasanya berisi test
folder, dll. Yang tidak perlu kita gunakan.) Adakah ide lain untuk mengatasinya? Sayangnya, tidak menggunakan Windows bukanlah pilihan :)
package.json
dengandependencies
set? Jika demikian, dapatkah Anda menyalin tanpanode_modules
dan menggunakan npm keinstall
atauupdate
dependensi?npm install
di 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 memasukkannode_modules
secara langsung.Jawaban:
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 flat
bagian.Dan komentar terakhir tentang masalah ini https://github.com/npm/npm/issues/3697
sumber
flat flat
sekarang terkubur di halaman lain. Ini tautan langsungnya: github.com/npm/npm/releases/tag/v3.0.0hanya 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 dedupe
tidak 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
npm ls
untuk mendapatkan daftar semua modul yang terpasang.npm install module@version --save-dev
untuk menginstal modul-modul tersebut di direktori root node_modules dan memperbarui package.json.rmdir node_modules
untuk menghapus direktori node_modules.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.
sumber
Saya tidak berpikir ada solusi bagus mengingat kendala Anda, tetapi berikut adalah beberapa hal yang dapat membantu.
npm dedupe
untuk mengoptimalkan hierarki direktori Anda yang mungkin mempersingkat beberapa jalurnpm install --production
untuk menginstal tanpa alat pengembangannode_modules
direktori tertinggi di bawahnyayour_project/node_modules/pkg_with_deep_deps
yang akan memungkinkan mereka memiliki jalur yang cukup pendek tetapi masih berfungsi. Jadi ini akan menjadiyour_project/node_modules/pkg_with_deep_deps/node_modules
.require
harus 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.
sumber
dedupe
(tidak tahu sama sekali) dan--production
(npm install -h
tidak menampilkan opsi ini)! Sayangnya, menggunakan arsip ZIP bukanlah suatu pilihan, lihat komentar di atas.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.
sumber
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.
sumber
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>
sumber
Saya menemukan satu solusi dari Microsoft Node.js Pedoman .
> npm install -g rimraf
hapus file yang melebihimax_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 versinpm@3
yang mencoba membuatnode_modules
hierarki folder menjadi datar maksimal.> npm install –g npm-windows-upgrade
sumber
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.
sumber