Bagaimana cara mengatur lokasi khusus untuk instalasi lokal paket npm?

177

Apakah mungkin untuk menentukan tujuan paket khusus untuk npm install, baik melalui bendera perintah atau variabel lingkungan?

Secara default, instalasi npm lokal berakhir di node_modulesdalam direktori saat ini, tetapi saya ingin menginstalnya ke node_modulesdalam direktori yang berbeda, misalnya vendor/node_modules. Bagaimana saya bisa mewujudkannya?

Pje
sumber
apa yang ingin kamu capai? ini telah dibahas di sini: stackoverflow.com/questions/13668097/…
Pascal Belloncle
10
@PascalBelloncle: Alih-alih menginstal paket ke subdirektori dari ./node_modules, saya ingin npm menginstalnya ke dalam subdirektori dari ./vendor/node_modules. (Atau diberi tahu bahwa itu tidak dapat dikonfigurasi.)
pdi
1
Saya mengerti itulah yang ingin Anda lakukan, yang saya pikir tidak mungkin dilakukan di luar kotak. Plus membutuhkan tidak akan berhasil juga. Jadi saya bertanya mengapa Anda ingin melakukan ini. Mungkin ada solusi alternatif untuk melakukan apa yang Anda inginkan.
Pascal Belloncle
1
Saya menginstal paket hanya untuk biner-nya (yaitu hanya akan digunakan pada baris perintah dan tidak pernah required) tetapi saya tidak ingin menginstalnya secara global.
pje
Saya melihat. Lihat saran saya di bawah ini.
Pascal Belloncle

Jawaban:

180

TL; DR

Anda dapat melakukan ini dengan menggunakan --prefixflag dan --global* flag.

pje@friendbear:~/foo $ npm install bower -g --prefix ./vendor/node_modules
bower@0.7.0 /Users/pje/foo/vendor/node_modules/bower

* Walaupun ini adalah instalasi "global", nampan yang dipasang tidak akan dapat diakses melalui baris perintah kecuali ~/foo/vendor/node_modulesada di PATH.

TL; R

Setiap atribut yang npmdapat dikonfigurasi dapat diatur di salah satu dari enam tempat berbeda. Dalam urutan prioritas:

  • Bendera Baris Perintah: --prefix ./vendor/node_modules
  • Variabel Lingkungan: NPM_CONFIG_PREFIX=./vendor/node_modules
  • File Konfigurasi Pengguna: $HOME/.npmrcatau userconfigparam
  • File Konfigurasi Global: $PREFIX/etc/npmrcatau userconfigparam
  • File Konfigurasi Internal: path/to/npm/itself/npmrc
  • Konfigurasi Default: node_modules / npmconf / config-defs.js

Secara default, paket yang diinstal secara lokal masuk ke ./node_modules. global yang masuk ke prefixvariabel config ( /usr/localsecara default).

Anda dapat menjalankan npm config listuntuk melihat konfigurasi Anda saat ini dan npm config editmengubahnya.

PS

Secara umum, npmdokumentasi sangat membantu. Bagian folder adalah gambaran struktural yang bagus dari npm dan bagian konfigurasi menjawab pertanyaan ini.

Pje
sumber
2
Saat saya uji, sebenarnya jika mengikuti perintah di atas, itu akan diinstal ./vendor/node_modules/lib/bowermenggunakannpm#3.8.0
e-cloud
2
Ketika melakukan ini, saya mendapatkan kesalahanNo version provided in package.json
FooBar
Anda menulis bins won't be accessible through the command line. Program ini tentu saja dapat dipanggil menggunakan path lengkap npm install [email protected] -g --prefix c:\my_npm` calling c: \ my_npm \ eslint --fix my.js`
Bernhard Döbler
13
Apakah mungkin untuk mencapai sesuatu yang mirip dengan file package.json? yaitu jika saya menjalankan npm installdi direktori A dengan file package.json, paket akan diinstal di direktori B. Tampaknya solusi ini adalah untuk paket individual yang diinstal.
Ryan-Neal Mes
1
Apakah ada cara menginstal semua dependensi menggunakan metode ini? npm installmenginstal dependensi secara lokal. npm install X -g -prefix "..."menginstal modul X ke awalan, npm install -g -prefix "..."menginstal paket saat ini ke awalan.
AnnanFay
28

Jika Anda menginginkan ini dalam konfigurasi, Anda dapat mengatur konfigurasi npm seperti:

npm config set prefix "$(pwd)/vendor/node_modules"

atau

npm config set prefix "$HOME/vendor/node_modules"

Periksa konfigurasi Anda dengan

npm config ls -l

Atau seperti @pje katakan dan gunakan --prefixbendera

Rimian
sumber
4
Saya percaya ini menetapkan awalan global? Jadi melakukan npm installmasih akan menginstal secara lokal ke ./node_modulestetapi npm install -gakan menginstal ke "$(pwd)/vendor/node_modules". Saya bisa membayangkan pengaturan ini kemudian melupakannya, kembali lagi bertanya-tanya mengapa paket global saya bertindak aneh.
AnnanFay
13

Untuk OSX, Anda dapat pergi ke pengguna Anda $HOME(mungkin / Users / yourname /) dan, jika belum ada, buat .npmrcfile (file yang digunakan npm untuk konfigurasi pengguna), dan buat direktori untuk paket npm Anda untuk dipasang di (misalnya, / Pengguna / namamu / npm). Dalam file .npmrc itu, setel "prefix" ke direktori npm baru Anda, yang akan menjadi tempat "npmrc" paket-paket yang diinstal secara global akan diinstal; paket-paket "global" ini, tentu saja, hanya akan tersedia untuk akun pengguna Anda.

Dalam .npmrc:

prefix=${HOME}/npm

Kemudian jalankan perintah ini dari baris perintah:

npm config ls -l

Seharusnya memberikan output pada konfigurasi lokal Anda sendiri dan konfigurasi global npm, dan Anda akan melihat konfigurasi awalan lokal Anda tercermin, mungkin di dekat bagian atas daftar panjang output.

Demi keamanan, saya merekomendasikan pendekatan ini untuk mengonfigurasi perilaku npm akun pengguna Anda daripada meng-chown-ing /usr/localfolder Anda , yang saya lihat direkomendasikan di tempat lain.

Ryan
sumber
9

Pada Windows 7 misalnya, serangkaian perintah / operasi berikut dapat digunakan.

Buat variabel lingkungan pribadi, backslash ganda wajib:

  • Nama variabel: %NPM_HOME%
  • Nilai variabel: C:\\SomeFolder\\SubFolder\\

Sekarang, atur nilai konfigurasi ke folder baru (nama file contoh):

  • Atur folder npm

npm config set prefix "%NPM_HOME%\\npm"

  • Atur folder npm-cache

npm config set cache "%NPM_HOME%\\npm-cache"

  • Atur folder sementara npm

npm config set tmp "%NPM_HOME%\\temp"

Secara opsional, Anda dapat membersihkan konten dari folder asli sebelum konfigurasi diubah.

  • Hapus npm-cache npm cache clear

  • Daftar modul npm npm -g ls

  • Hapus modul npm npm -g rm name_of_package1 name_of_package2

Michael Huelsen
sumber
1
Terima kasih, saya ikuti langkah-langkahnya. Tetapi ia menciptakan direktori yang disebut c: /% NPM_HOME% / npm, dll. Alih-alih c: / npm_home / npm
Jay
6

Setelah mencari sendiri ini menginginkan beberapa proyek dengan dependensi yang dibagikan menjadi KERING, saya menemukan:

  • Menginstal secara lokal adalah cara Node untuk apa pun yang ingin Anda gunakan via require()
  • Menginstal secara global adalah untuk binari yang Anda inginkan di jalur Anda, tetapi tidak dimaksudkan untuk apa pun melalui require()
  • Menggunakan awalan berarti Anda harus menambahkan jalur yang sesuai bindanman$PATH
  • npm link( info ) memungkinkan Anda menggunakan instalasi lokal sebagai sumber untuk global

→ tetap pada cara Node dan instal secara lokal

ref:

Oli Studholme
sumber