Tentukan jalur ke node_modules di package.json

96

Apakah ada cara untuk memindahkan direktori node_modules dalam aplikasi ke / vendor / node_modules seperti yang dilakukan bower dengan file bowerrc? Saya pikir itu bisa ditentukan dalam package.json tetapi sepertinya saya tidak dapat menemukan solusi. Bantuan Anda sangat dihargai.

sturoid
sumber
Saya kira sesuatu yang mirip dengan http://stackoverflow.com/questions/18974436/change-node-modules-location
sachinjain024
@blunderboy terima kasih untuk tautannya. Sungguh gila bahwa tidak ada cara yang lebih mudah untuk melakukannya. Baiklah.
sturoid
26
Saya tidak yakin mengapa Anda menerima jawaban yang jelas-jelas tidak menjawab pertanyaan Anda. Anda bertanya bagaimana cara mengatur jalur ke node_modules dalampackage.json , dan jawaban xShirase tidak memberikan cara untuk melakukan itu.
Mark Amery
4
Dia mungkin menerima jawabannya karena ini jelas merupakan masalah XY dan solusi alternatif lebih baik daripada "maaf, itu tidak mungkin."
Jake Holzinger

Jawaban:

58

ya Anda bisa, cukup setel variabel env NODE_PATH:

export NODE_PATH='yourdir'/node_modules

Menurut dok:

Jika variabel lingkungan NODE_PATH disetel ke daftar jalur absolut yang dipisahkan oleh titik dua, node akan mencari jalur tersebut untuk modul jika tidak ditemukan di tempat lain. (Catatan: Di Windows, NODE_PATH dipisahkan oleh titik koma, bukan titik dua.)

Selain itu, node akan mencari di lokasi berikut:

1: $ HOME / .node_modules

2: $ HOME / .node_libraries

3: $ PREFIX / lib / node

Di mana $ HOME adalah direktori home pengguna, dan $ PREFIX adalah node_prefix yang dikonfigurasi oleh node.

Ini sebagian besar karena alasan historis. Anda sangat dianjurkan untuk menempatkan dependensi Anda secara lokal di folder node_modules. Mereka akan dimuat lebih cepat, dan lebih andal.

Sumber

xShirase
sumber
1
Itu hebat. Jadi dalam kasus saya di mana saya memiliki node_modules lokal untuk setiap aplikasi yang saya buat, apakah saya akan melakukan ekspor itu dalam file js dalam proyek?
sturoid
3
tidak, ini adalah variabel lingkungan, ini disiapkan di tingkat sistem. Jadi, Anda harus mengetiknya di terminal Anda. Variabel env diakses dalam aplikasi node diprocess.env
xShirase
Hmmm terdengar bagus. Saya harus memeriksanya lagi. Terima kasih untuk bantuannya.
sturoid
112
Saya tidak benar-benar berpikir ini adalah jawaban untuk pertanyaan: Dia meminta properti di dalam package.json untuk meletakkan jalur untuk paket npm-LOCAL (level aplikasi). Jawaban ini memberitahu dia bagaimana dia bisa memindahkan paket yang terinstal SECARA GLOBAL (-g) ke folder lain.
David Losert
2
@IsmailIqbal Maaf saya baru saja melihat komentar anda. Sudah dua tahun di dunia NPM dan kami mengambil lompatan yang cukup dengan caching, benang atau bahkan npm5, webpack ... Saya akan mengatakan penanganan node_module hari ini jauh lebih baik. Dalam kasus Anda, saya hanya akan melakukan "npm install" di semua lokasi - karena npm cache sudah menginstal paket, itu sama dengan menyalinnya secara manual tanpa overhead.
David Losert
28

Singkatnya: Ini tidak mungkin, dan sepertinya tidak akan pernah didukung (lihat di sini https://github.com/npm/npm/issues/775 ).

Ada beberapa pekerjaan hacky dengan menggunakan CLI atau ENV-Variables (lihat jawaban yang dipilih saat ini), .npmrc-Config-Files atau npm link- apa yang mereka semua miliki: Mereka tidak pernah hanya proyek-spesifik, tetapi selalu semacam dari globalSolutions.

Bagi saya, tidak ada solusi yang benar-benar bersih karena kontributor proyek Anda selalu perlu membuat beberapa konfigurasi khusus atau memiliki pengetahuan khusus - mereka tidak bisa npm installdan berfungsi.

Jadi: Anda harus meletakkan package.json Anda di direktori yang sama di mana Anda ingin node_modules Anda diinstal, atau hidup dengan fakta bahwa mereka akan selalu berada di root-dir proyek Anda.

David Losert
sumber
16
"Jika Anda ingin mengeja" node_modules "secara berbeda, maaf, tidak ada yang bisa dilakukan. Itu dibangun ke dalam node-core. Mengubahnya sama saja dengan membangun manajer paket yang sama sekali berbeda." <== kerja bagus menggunakan variabel, kurasa.
stevedbrown
Komentar dari 2019: sepertinya benang mendukung penggantian direktori modul. Yah, benang adalah manajer paket baru, kurasa.
Vanuan
10

Benang mendukung fitur ini:

# .yarnrc file in project root
--modules-folder /node_modules

Tetapi pengalaman Anda dapat bervariasi tergantung pada paket mana yang Anda gunakan. Saya tidak yakin Anda ingin masuk ke lubang kelinci itu.

Vanuan
sumber
6

Saya tidak yakin apakah ini yang Anda pikirkan, tetapi saya berakhir dengan pertanyaan ini karena saya tidak dapat menginstal node_modulesdi dalam direktori proyek saya karena dipasang pada sistem file yang tidak mendukung symlink (folder "bersama" VM ).

Saya menemukan solusi berikut:

  1. Salin package.jsonfile ke folder temp pada sistem file yang berbeda
  2. Lari npm installkesana
  3. Salin node_modulesdirektori yang dihasilkan kembali ke direktori proyek, gunakan cp -r --dereferenceuntuk memperluas symlink menjadi salinan.

Saya harap ini membantu orang lain yang akhirnya menjawab pertanyaan ini ketika mencari cara untuk pindah node_moduleske sistem file yang berbeda.

Pilihan lain

Ada solusi lain, yang saya temukan di masalah github yang ditautkan oleh @Charminbear , tetapi ini tidak berfungsi gruntkarena tidak mendukung NODE_PATHsesuai https://github.com/browserify/resolve/issues/136 :

katakanlah Anda memiliki /media/sf_shareddan Anda tidak dapat menginstal symlink di sana, yang berarti Anda sebenarnya tidak dapat menginstal npm /media/sf_shared/myprojectkarena beberapa modul menggunakan symlink.

  • $ mkdir /home/dan/myproject && cd /home/dan/myproject
  • $ ln -s /media/sf_shared/myproject/package.json (Anda dapat melakukan symlink ke arah ini, tetapi tidak dapat membuatnya di dalam / media / sf_shared)
  • $ npm install
  • $ cd /media/sf_shared/myproject
  • $ NODE_PATH=/home/dan/myproject/node_modules node index.js
Kaya
sumber