cara menentukan modul lokal sebagai dependensi paket npm

269

Saya memiliki aplikasi yang memiliki set dependensi yang biasa pada modul pihak ketiga (misalnya 'express') yang ditentukan dalam file package.json di bawah dependensi. Misalnya

"express"     : "3.1.1"

Saya ingin membuat struktur kode saya sendiri secara modular dan memiliki satu set modul lokal (artinya pada sistem file saya saat ini) diinstal oleh package.json. Saya tahu bahwa saya dapat menginstal modul lokal dengan menjalankan:

npm install path/to/mymodule

Namun, saya tidak tahu bagaimana cara mewujudkannya melalui struktur dependensi package.json. Menggunakan --saveopsi dalam perintah ini hanya menempatkan "mymodule": "0.0.0"ke package.json saya (tidak merujuk lokasi filepath). Jika saya kemudian menghapus versi yang terinstal dari node_modules, dan mencoba menginstal ulang dari package.json, gagal (karena mencari "mymodule" di registri pusat, dan tidak terlihat secara lokal).

Saya yakin ini adalah cara untuk memberitahukan "dependencies": {}struktur yang saya inginkan untuk diinstal dari jalur sistem file, tetapi tidak tahu caranya.

Adakah yang punya masalah ini? Terima kasih.

Sam Adams
sumber
1
Pertanyaan yang sangat bagus. Sedih menyadari bahwa tidak ada fitur yang setara package.jsondengan apa yang kita miliki di Gemfile.
Jarl
3
kemungkinan duplikat dependensi lokal di package.json
Kelly

Jawaban:

408

npm install sekarang mendukung ini

npm install --save ../path/to/mymodule

Agar ini berfungsi mymoduleharus dikonfigurasikan sebagai modul dengan modulnya sendiri package.json. Lihat Membuat modul NodeJS .

Pada npm 2.0, dependensi lokal didukung secara native. Lihat jawaban danilopopeye untuk pertanyaan serupa . Saya telah menyalin jawabannya di sini karena pertanyaan ini menempati peringkat sangat tinggi dalam hasil pencarian web.

Fitur ini diimplementasikan dalam versi 2.0.0 npm. Sebagai contoh:

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

Salah satu jalur berikut ini juga valid:

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

menyinkronkan pembaruan

Sejak npm installsalinan mymoduleke node_modules, perubahan mymodulesumber 's akan secara otomatis terlihat oleh proyek tergantung.

Ada dua cara untuk memperbarui proyek dependen

  • Perbarui versi mymoduledan kemudian gunakannpm update : Seperti yang Anda lihat di atas, package.jsonentri "dependensi" tidak menyertakan penentu versi seperti yang akan Anda lihat untuk dependensi normal. Sebaliknya, untuk dependensi lokal, npm updatehanya mencoba untuk memastikan terbaru versi diinstal, sebagaimana ditentukan oleh mymodule's package.json. Lihat jawaban chriskelly untuk masalah khusus ini .

  • Instal ulang menggunakan npm install. Ini akan menginstal apa pun yang ada di mymodulejalur sumber, bahkan jika itu lebih tua, atau memiliki cabang alternatif diperiksa, apa pun.

Randy the Dev
sumber
2
Ini berhasil untuk saya. (Saya baru saja melakukan jalur relatif lokal seperti"mymodule":"file:mymoduledir"
Don Rhummy
72
npm install --save ../my-local-repo
Ivan Rave
15
Dan bagaimana menggunakannya dalam proyek? Saya mencoba menyebutnya seperti import { HelloWorld } from "my-test-lib";, tetapi saya menerima kesalahan "Cant find module". Silakan, lihat stackoverflow.com/questions/46818083/...
Vitalii Vasylenko
6
@LucioMollinedo dapatkah Anda membagikan sintaks bagaimana Anda mengimpor modul lokal? Seperti halnya Vitallii, saya mendapatkan kesalahan "Can't fine module" denganimport { HelloWorld } from "my-test-lib";
Stan James
7
Ini tidak berfungsi sama dengan merujuk paket karena dependensi tidak akan diinstal ke proyek
Glass Cannon
44

Lihat: Ketergantungan lokal di package.json

Sepertinya jawabannya adalah npm link: https://docs.npmjs.com/cli/link

jasoncrawford
sumber
5
sebenarnya npm link hanya akan membuat symlink, dan tidak akan memodifikasi package.json untuk menambah ketergantungan lokal
Sebastien H.
1
Tetapi jika itu bukan symlinkbagaimana proyek induk tahu untuk membangun kembali setelah ketergantungan selesai dibangun?
Jamie Hutber
11

Saya tidak dapat menemukan cara yang rapi pada akhirnya jadi saya pergi untuk membuat direktori bernama local_modulesdan kemudian menambahkan bashscript ini ke package.json di skrip-> pra-instal

#!/bin/sh
for i in $(find ./local_modules -type d -maxdepth 1) ; do
    packageJson="${i}/package.json"
    if [ -f "${packageJson}" ]; then
        echo "installing ${i}..."
        npm install "${i}"
    fi
done
Sam Adams
sumber
5

Setelah berjuang keras dengan npm linkperintah (solusi yang disarankan untuk mengembangkan modul lokal tanpa menerbitkannya ke registri atau mempertahankan salinan terpisah di folder node_modules), saya membangun modul npm kecil untuk membantu masalah ini.

Perbaikan memerlukan dua langkah mudah .

Pertama:

npm install lib-manager --save-dev

Kedua, tambahkan ini ke package.json:

{  
  "name": "yourModuleName",  
  // ...
  "scripts": {
    "postinstall": "./node_modules/.bin/local-link"
  }
}

Lebih detail di https://www.npmjs.com/package/lib-manager . Semoga ini bisa membantu seseorang.

Anurag Dutta
sumber
0

Jika Anda dapat dengan mudah menerbitkan modul-modul Anda yang sudah diinstal di node_modules bersama file-file Anda yang lain, Anda dapat melakukannya seperti ini:

// ./node_modules/foo/package.json
{ 
  "name":"foo",
  "version":"0.0.1",
  "main":"index.js"
}

// ./package.json
...
"dependencies": {
  "foo":"0.0.1",
  "bar":"*"
}

// ./app.js
var foo = require('foo');

Anda mungkin juga ingin menyimpan modul Anda di git dan memberi tahu orang tua Anda package.json untuk menginstal dependensi dari git: https://npmjs.org/doc/json.html#Git-URLs-as-Dependencies

Plato
sumber
5
Sayangnya itu akan melibatkan node_modules yang memiliki modul lokal saya dan modul pihak ketiga / kontribusi yang diinstal dari registri (misalnya terhubung) di direktori yang sama. Selain itu membingungkan dari perspektif Git / VCS (yaitu harus mengabaikan semua dalam node_modules kecuali yang saya buat), itu juga praktik yang buruk (yang saya tulis dan tidak dipublikasikan harus dipisahkan dari yang ditulis dan diterbitkan oleh orang lain. ).
Sam Adams
Ketika saya menambahkan modul lokal kemudian membuat perubahan ini tidak terlihat oleh aplikasi utama saya. Mengapa demikian?
Mark Tyers