Ketergantungan lokal di package.json

453

Saya ingin melakukan sesuatu seperti ini, sehingga npm installjuga menginstal package.jsondari ../somelocallibatau lebih penting dependensinya.

"dependencies": {
    "express": "*",
    "../somelocallib": "*"
}
pengguna1680104
sumber

Jawaban:

582

npm> = 2.0.0

Fitur ini diimplementasikan dalam versi 2.0.0 npm. Contoh:

{
  "name": "baz",
  "dependencies": {
    "bar": "file:../foo/bar"
  }
}

Salah satu jalur berikut ini juga valid:

../foo/bar
~/foo/bar
./foo/bar
/foo/bar

Paket lokal akan disalin ke awalan ( ./node-modules).

npm <2.0.0

Masukkan somelocallibsebagai ketergantungan pada Anda package.jsonseperti biasa:

"dependencies": {
  "somelocallib": "0.0.x"
}

Kemudian jalankan npm link ../somelocallibdan npm akan menginstal versi yang sedang Anda kerjakan sebagai symlink .

app@0.0.1 /private/tmp/app
└── somelocallib@0.0.1 -> /private/tmp/somelocallib

Referensi: tautan (1)

danilopopeye
sumber
3
Bagaimana kami dapat memutuskan tautannya?
AtaurRehman Asad
13
Kelemahan dari menginstal paket lokal dengan "npm link" adalah Anda mendapatkan banyak duplikasi modul. Ketika Anda mendaftar dependensi Anda dengan "module: version" atau "module: git-repo", algoritma install npm menghindari untuk menginstal paket yang sudah diinstal dalam paket induk. Jadi dengan "npm link", jika aplikasi utama Anda bergantung pada "[email protected]" dan semua paket lokal Anda juga tergantung pada "[email protected]" Anda akan mengakhiri semua paket lokal dengan menginstal "[email protected]. 0 "daripada menggunakan versi" async "aplikasi utama yang diinstal sama. Ini tidak terjadi menggunakan "folder instalasi npm".
Pedro Ballesteros
3
@PedroBallesteros Anda dapat menggunakan npm dedupuntuk memperbaiki masalah ini. npmjs.org/doc/cli/npm-dedupe.html
danilopopeye
4
"Paket lokal akan disalin ..." tampaknya tidak menjadi masalah dengan versi npm yang lebih baru. Sekarang, symlink dibuat.
tsauerwein
2
@danilopopeye Per docs.npmjs.com/cli/instalasi npm install <folder> deskripsi mengatakan Instal paket di direktori sebagai symlink dalam proyek saat ini.
Herman J. Radtke III
211

Sekarang dimungkinkan untuk menentukan jalur pemasangan modul Node lokal di Anda package.jsonsecara langsung. Dari dokumen:

Jalur Lokal

Pada versi 2.0.0 Anda dapat memberikan jalur ke direktori lokal yang berisi paket. Jalur lokal dapat disimpan menggunakan npm install -Satau npm install --save, menggunakan salah satu dari formulir ini:

../foo/bar
~/foo/bar
./foo/bar
/foo/bar

dalam hal ini mereka akan dinormalisasi ke jalur relatif dan ditambahkan ke Anda package.json. Sebagai contoh:

{
  "name": "baz",
  "dependencies": {
    "bar": "file:../foo/bar"
  }
}

Fitur ini bermanfaat untuk pengembangan offline lokal dan membuat tes yang memerlukan penginstalan npm di mana Anda tidak ingin menekan server eksternal, tetapi tidak boleh digunakan saat menerbitkan paket ke registri publik.

Michael Trouw
sumber
23
Dalam npm v.3 +, normalisasi itu absolut, bukan relatif , sehingga Anda akan melihat sesuatu seperti"bar": "file:///home/user/src/foo/bar"
Ron Wertlen
27
Bagaimana cara memperbarui ketergantungan jalur lokal tanpa penambahan versi?
Bohdan Lyzanets
3
Ngomong-ngomong, ini menyebabkan semua jenis masalah kapan dan / atau jika Anda mencoba mengurangi aplikasi simpul Anda, karena node:onbuildgambar standar hanya menyalin direktori saat ini, dan dengan demikian tidak menyertakan apa pun di dalamnya ../foo.
donmartin
4
apakah ada cara untuk mengintegrasikan ini dengan git + ssh sehingga orang dapat memiliki salinan lokal dari repositori git yang npm installberasal dari atau repositori git lain di LAN? Ketika saya mencoba yang di atas dan menginstal npm dari git + ssh tampaknya untuk melihat di direktori node_modules dan tidak mencoba untuk pergi ke git + ssh meskipun itu adalah bagaimana saya menginstal paket tingkat atas.
Michael
1
Menginstal pekerjaan. Tetapi dengan cara ini saya akan mendapatkan "ERR not found" ketika mencoba mengimpor modul ke proyek saya.
C4d
87

Ini bekerja untuk saya.

Tempatkan yang berikut ini di file package.json Anda

"scripts": {
    "preinstall": "npm install ../my-own-module/"
}
Brian McAuliffe
sumber
4
Terima kasih atas sarannya yang tidak memerlukan penggunaan "tautan npm"
ItalyPaleAle
Itu dihapus .gitignoredalam folder modul, dibuat .npmignoredan pertama kali saya menjalankannya diterapkan 777 secara rekursif pada semua folder kecuali node_modules. Tapi ya, itu menginstal dependensi. Menggunakan npm versi 1.4.14.
L0LN1NJ4
menggunakan ini, tapi bukannya mengotak-atik node_modules Saya sudah menggunakan app_modules
catalint
1
Mengapa tidak "dependencies": { "my-own-module": "file:../my-own-module" }?
Bohdan Lyzanets
1
Saya setuju dengan @Bohdan di sini. dependensi lokal akan melakukan hal yang sama persis. Keuntungan menggunakan npm linkadalah bahwa Anda tidak perlu melakukan npm installsetiap waktu untuk mendapatkan dependensi Anda yang terbaru.
froginvasion
30

Jika Anda ingin mengotomatiskan ini lebih lanjut, karena Anda memeriksa modul Anda ke dalam kontrol versi, dan tidak ingin bergantung pada dev yang mengingat tautan npm, Anda dapat menambahkan ini ke bagian package.json "script" Anda:

"scripts": {
    "postinstall": "npm link ../somelocallib",
    "postupdate": "npm link ../somelocallib"
  }

Ini terasa luar biasa, tetapi tampaknya "berhasil". Dapatkan tip dari masalah npm ini: https://github.com/npm/npm/issues/1558#issuecomment-12444454

Taytay
sumber
15
Mengapa postinstalldan postupdatebukannya preinstalldan preupdate?
sayap kanan
1
Bisakah Anda menjelaskan sedikit lebih banyak tentang apa ini. yaitu jika saya mensetup proyek vscode dengan beberapa folder root (yaitu "ruang kerja multi-root"), akankah ia dapat langsung mencerminkan perubahan dalam folder modul untuk proyek yang memakan? - Itukah yang dimaksud dengan peretasan ini?
bvdb
26

Inilah cara Anda akan menambahkan dependensi lokal:

npm install file:src/assets/js/FILE_NAME

Tambahkan ke package.json dari NPM:

npm install --save file:src/assets/js/FILE_NAME

Tambahkan langsung ke package.json seperti ini:

....
  "angular2-autosize": "1.0.1",
  "angular2-text-mask": "8.0.2", 
  "animate.css": "3.5.2",
  "LIBRARY_NAME": "file:src/assets/js/FILE_NAME"
....
sreekanth
sumber
6

Proyek master

Ini adalah package.json yang akan Anda gunakan untuk proyek master:

"dependencies": {
    "express": "*",
    "somelocallib": "file:./somelocallib"
}

Di sana, ./somelocallibadalah referensi ke folder perpustakaan sebagai relatif terhadap paket proyek utama .

Referensi: https://docs.npmjs.com/files/package.json#local-paths


Sub proyek

Tangani dependensi perpustakaan Anda.

Selain berlari npm install, Anda harus berlari (cd node_modules/somelocallib && npm install).

Ini adalah bug yang dikenal dengan NPM.

Referensi: https://github.com/npm/npm/issues/1341 (mencari referensi yang lebih terkini)


Catatan untuk Docker

Periksa master Anda package.lockdan Anda somelocallib/package.lockke manajer kode sumber Anda.

Kemudian dalam penggunaan Dockerfile Anda:

FROM node:10
WORKDIR /app
# ...
COPY ./package.json ./package-lock.json ./
COPY somelocallib somelocallib
RUN npm ci
RUN (cd node_modules/zkp-utils/ && npm ci)
# ...

Saya menggunakan tanda kurung dalam (cd A && B)konstruksi saya untuk membuat operasi idempoten.

William Entriken
sumber
3

Saya tahu itu npm install ../somelocallibberhasil.

Namun, saya tidak tahu apakah sintaks yang Anda perlihatkan dalam pertanyaan akan berfungsi dari package.json...

Sayangnya, doc tampaknya hanya menyebutkan URL sebagai ketergantungan.

Coba file:///.../...tar.gz, tunjuk lib lokal yang di-zip ... dan beri tahu kami jika berhasil.

HAI
sumber
1
Saya menambahkan "dependensi": {"somemodule": "file: ///./internal_modules/somemodule"} ke package.json. Itu tidak bekerja. Kode kesalahan adalah "npm ERR! Code E404".
Jeffrey
2

Ini bekerja untuk saya: pertama, pastikan direktori npm memiliki pengguna yang tepat

sudo chown -R myuser ~/.npm
sudo chown -R myuser /usr/local/lib/node_modules

Kemudian link Anda di package.json Anda

"scripts": {
 "preinstall": "npm ln mylib ../../path/to/mylib"
}, 
"dependencies": {
  "mylib" : "*"
}
Sofia
sumber
2
Tautan simbolis pada Windows dimungkinkan sejak XP en.wikipedia.org/wiki/NTFS_symbolic_link . Buka baris perintah sebagai administrator, lalu jalankan npm install.
sedih
2

Sebenarnya, pada npm 2.0, sekarang ada dukungan jalur lokal (lihat di sini ).

Damirv
sumber
8
Michael Trouw sudah memberikan jawaban ini beberapa minggu sebelumnya, jadi mengapa menduplikasi?
Dan Dascalescu
2

Penasaran ..... setidaknya di Windows (npm saya 3.something) yang perlu saya lakukan:

"dependencies": {
 "body-parser": "^1.17.1",
 "module1": "../module1",
 "module2": "../module2",

Ketika saya melakukan npm install ../module1 --saveitu menghasilkan jalur absolut dan bukan relatif per dokumentasi.

Saya mengacaukan sedikit lagi dan memutuskan itu ../xxxsudah cukup.

Secara khusus, saya memiliki modul simpul lokal diperiksa untuk mengatakan d: \ build \ module1, d: \ build \ module2 dan proyek simpul saya (aplikasi) di d: \ build \ nodeApp.

Untuk 'menginstal', saya:

d:\build\module1> rmdir "./node_modules" /q /s && npm install
d:\build\module2> rmdir "./node_modules" /q /s && npm install
d:\build\nodeApp> rmdir "./node_modules" /q /s && npm install

module1's package.json memiliki ketergantungan pada "module2": "../module2"; module2 tidak memiliki ketergantungan lokal; nodeApp memiliki dependensi "module1": "../module1" dan "module2": "../module2".

Tidak yakin apakah ini hanya berfungsi untuk saya karena semua 3 folder (module1, module2 dan nodeApp) berada pada level yang sama .......

Paul Duncan
sumber