Memasang modul lokal menggunakan npm?

419

Saya memiliki repo modul yang diunduh, saya ingin menginstalnya secara lokal, bukan secara global di direktori lain?

Apa cara mudah untuk melakukan ini?

mewah
sumber

Jawaban:

481

Dari dokumentasi npm-link :

Dalam direktori modul lokal:

$ cd ./package-dir
$ npm link

Dalam direktori proyek untuk menggunakan modul:

$ cd ./project-dir
$ npm link package-name

Atau sekaligus menggunakan jalur relatif:

$ cd ./project-dir
$ npm link ../package-dir

Ini sama dengan menggunakan dua perintah di atas di bawah tenda.

Apodaca kaya
sumber
14
Ini adalah satu-satunya pendekatan yang terlihat waras yang pernah saya lihat sejauh ini - mengapa npm harus begitu kabur / tumpul w. salam untuk membuat paket lokal, menginstalnya dan kemudian menggunakannya, saya tidak tahu ... tautan berfungsi, (dan ini hebat), tetapi terminologinya agak membingungkan.
smaudet
6
@ Rich Apodaca, terima kasih atas tautan dokumen. Itu tidak menyebutkan membatalkan proses. Sepertinya yang dilakukannya hanyalah membuat symlink, jadi saya bisa menghapusnya seperti biasa?
Tyler Collier
1
@TylerCollier npm unlink tampaknya menjadi operasi mirror-image stackoverflow.com/a/24940024/54426
Rich Apodaca
1
Hanya sebuah catatan, jika Anda menggunakan Angular2 (atau mungkin aplikasi lain?), Ada beberapa buzz di sekitar npm yang menghubungkan akar penyebab masalah tertentu. Contoh di sini dan di sini
The Red Pea
4
Namun perlu diingat bahwa ini npm linkakan membuat instance kedua dari dependensi eksternal. Jadi, jika Anda memiliki paket A perlu B dan C, B membutuhkan C. menghubungkan B akan menyebabkan aplikasi A memiliki dua contoh C.
user2167582
422

Anda cukup memberikan satu <folder>argumen npm install, argumen harus mengarah ke folder lokal alih-alih nama paket:

npm install /path
mewah
sumber
5
Tidak seperti tautan, ini menggunakan .npmignore.
Camille Wintz
30
@ bithavoc Setidaknya pada npm 5, menginstal folder sekarang membuat symlink, bukan salinan. Lihat docs.npmjs.com/cli/install
Frank Tan
3
Saya mencoba menggunakan cara ini, tetapi modul saya tidak dapat menemukannya dengan peerDependencies.
Witalo Benicio
1
senang rm -rf node_modulessebelum dan npm installsesudah Anda menjalankan skrip jawabannya.
Renato Kembali
3
@ FrankTan Ya, tapi bagaimana cara mendapatkan perilaku lama? Saya ingin salinannya!
Michael
151

Karena ditanya dan dijawab oleh orang yang sama, saya akan menambahkan tautan npm sebagai alternatif.

dari docs:

Ini berguna untuk menginstal barang-barang Anda sendiri, sehingga Anda dapat mengerjakannya dan mengujinya berulang-ulang tanpa harus terus membangun kembali.

cd ~/projects/node-bloggy  # go into the dir of your main project
npm link ../node-redis     # link the dir of your dependency

[Sunting] Pada NPM 2.0, Anda dapat mendeklarasikan dependensi lokal di package.json

"dependencies": {
    "bar": "file:../foo/bar"
  }
Luke W
sumber
11
Mungkin bukan maksud asli dari pertanyaan, tetapi mungkin itulah yang diinginkan sebagian besar orang melalui google.
Dusty J
1
Jawaban ini tampaknya tidak lengkap, Anda perlu menjalankan npm linkterhadap folder sekali (untuk membuat symlink global) dan kemudian jalankan npm link package-namedalam folder proyek (untuk menggunakan symlink global dalam proyek Anda). Jawaban di bawah adalah jawaban yang tepat.
Thomas Potaire
8
@ThomasPotaire kedua jawaban itu benar. Jika Anda melihat dokumentasi tautan npm, ia menyajikan kedua metode, dengan pendekatan direktori relatif ini sebagai singkatan.
MJ
1
Metode kedua (menggunakan file:pendekatan) memungkinkan aplikasi saya dan modul lokal untuk berbagi ketergantungan. Tes saya npm linkmenghasilkan ketergantungan duplikat, yang memecah hal-hal jika ketergantungan perlu digunakan sebagai tunggal.
Daniel Waltrip
Saya punya paket lokal (misalkan package1), package2 memiliki dependensi yang disebutkan dengan path relatif package1. npm saya tidak menginstal paket ketika path relatif dimulai dengan "file: ../../ package1", berfungsi saat itu adalah '' ../../package1 ", apakah menambahkan file di awal berarti yang lain?
Dip686
17

npm pack + package.json

Inilah yang bekerja untuk saya:

LANGKAH 1: Dalam module project, jalankan npm pack:

Ini akan membangun <package-name>-<version>.tar.gzfile.

LANGKAH 2: Pindahkan file ke consumer project

Idealnya Anda dapat meletakkan semua file tersebut di tmpfolder di consumer-projectroot Anda :

LANGKAH 3: Rujuk di package.json:

"dependencies": {
  "my-package": "file:/./tmp/my-package-1.3.3.tar.gz"
}

LANGKAH 4: Installpaket:

npm installatau npm iatauyarn

Sekarang, paket Anda akan tersedia di consumer-project's node_modulesfolder Anda .

Semoga berhasil...

Akash
sumber
10

Tidak satu pun dari pendekatan ini ( npm linkatau package.jsonketergantungan file) yang berfungsi jika modul lokal memiliki dependensi rekan yang hanya ingin Anda instal dalam lingkup proyek Anda.

Sebagai contoh:

/local/mymodule/package.json:
  "name": "mymodule",
  "peerDependencies":
  {
    "foo": "^2.5"
  }

/dev/myproject/package.json:
  "dependencies":
  {
    "mymodule": "file:/local/mymodule",
    "foo": "^2.5"
  }

Dalam skenario ini, set NPM up myproject's node_modules/seperti ini:

/dev/myproject/node_modules/
  foo/
  mymodule -> /local/mymodule

Ketika node memuat mymoduledan itu terjadi require('foo'), node menyelesaikan mymodulesymlink, dan kemudian hanya mencari /local/mymodule/node_modules/(dan leluhurnya) foo, yang tidak ditemukannya. Sebagai gantinya, kami ingin simpul untuk melihat /local/myproject/node_modules/, karena dari situlah menjalankan proyek kami, dan di mana foodiinstal.

Jadi, kita juga perlu cara untuk memberitahu node ke tidak menyelesaikan symlink ini ketika mencari foo, atau kita perlu cara untuk memberitahu NPM untuk menginstal salinan dari mymoduleketika sintaks file dependensi digunakan dalam package.json. Saya belum menemukan cara untuk melakukan keduanya, sayangnya :(

Paul Medynski
sumber
Saya menemukan solusi, yaitu mengatur NODE_PATHuntuk menunjuk ke node_modules/tempat foodiinstal. Jadi untuk kasus di atas, akan menjadi ini: NODE_PATH=/dev/myproject/node_modules/ Itu memungkinkan mymoduleuntuk menemukan foo.
Paul Medynski
Ada solusi untuk itu. Masukkan modul dependensi ke folder root proyek . Tentukan dependensi Anda di package.json dengan awalan 'file:' biasa . Do npm i Ini akan membuat symlink di node_modules proyek serta dependensinya dapat diangkat ke toplevel node_modules seperti yang akan mereka lakukan untuk jenis dependensi lainnya. Versi npm saya adalah v6.14.4. Setelah menghabiskan beberapa jam tentang cara memperbaikinya, temukan solusi ini di sini: ( atmos.washington.edu/~nbren12/reports/journal/… ). Terima kasih nbren12.
sasebot
Saya mengalami masalah yang sama. Saya menemukan jawaban ini: stackoverflow.com/questions/50807329/… , ini memecahkan masalah saya dengan dependensi rekan dan perpustakaan lokal.
theawless
0

Kehilangan properti utama?

Seperti yang dijawab orang sebelumnya npm --save ../location-of-your-packages-root-directory. The ../location-of-your-packages-root-directorynamun harus memiliki dua hal dalam rangka untuk itu untuk bekerja.

1) package.jsondalam direktori yang diarahkan

2) mainproperti di package.jsonharus diatur dan berfungsi ig "main": "src/index.js",jika file entri ../location-of-your-packages-root-directoryadalah../location-of-your-packages-root-directory/src/index.js

K - Toksisitas dalam SO meningkat.
sumber