Bagaimana cara menggunakan versi lokal modul di node.js
. Misalnya, di aplikasi saya, saya menginstal skrip kopi:
npm install coffee-script
Ini menginstalnya ./node_modules
dan perintah kopi di ./node_modules/.bin/coffee
. Apakah ada cara untuk menjalankan perintah ini ketika saya berada di folder utama proyek saya? Saya kira saya sedang mencari sesuatu yang mirip bundle exec
di bundler. Pada dasarnya, saya ingin menentukan versi naskah kopi yang semua orang yang terlibat dengan proyek harus menggunakan.
Saya tahu saya dapat menambahkan -g
bendera untuk menginstalnya secara global sehingga kopi berfungsi dengan baik di mana saja, tetapi bagaimana jika saya ingin memiliki versi kopi yang berbeda per proyek?
node.js
coffeescript
npm
node-modules
typeoneerror
sumber
sumber
npm install niftycommand
dan kemudianniftycommand
. Tetapi ini tidak akan berhasil kecuali Anda memiliki ./node_modules/.bin di jalur Anda, bukan?coffee
perintah Anda ke dalamnpm scripts
bagian, seperti"build": "coffee -co target/directory source/directoy", so you can run
npm run build` dari terminal sesudahnya.npx
yang datang dengannpm 5.2.0
medium.com/@maybekatz/…Jawaban:
PEMBARUAN : Seperti yang ditunjukkan Seyeong Jeong dalam jawaban mereka di bawah ini, karena npm 5.2.0 dapat Anda gunakan
npx [command]
, yang mana lebih nyaman.JAWABAN LAMA untuk versi sebelum 5.2.0 :
Masalah dengan menempatkan
ke dalam PATH Anda adalah bahwa itu hanya berfungsi ketika direktori kerja Anda saat ini adalah akar dari struktur direktori proyek Anda (yaitu lokasi
node_modules
)Tidak tergantung pada direktori kerja Anda, Anda bisa mendapatkan jalur binari yang diinstal secara lokal
Untuk menjalankan
coffee
biner yang diinstal secara lokal di mana Anda berada dalam hierarki direktori proyek, Anda dapat menggunakan konstruk bash iniSaya alias ini untuk npm-exec
Jadi, sekarang saya bisa
untuk menjalankan kopi yang benar di mana pun saya berada
sumber
alias coffee="npm-exec coffee"
npm bin
mencari rantai 'direktori leluhur' ke cwd untuk direktori node_modules. Ini persis perilaku yang diinginkan jika Anda secara khusus ingin menggunakan binari modul yang tercantum dalam package.json proyek.PATH
akan kembali ke apa itu sebelum doa perintah. Mengatur variabel lingkungan di baris yang sama, sebelum menjalankan perintah hanya memengaruhi lingkungan perintah itu.Anda tidak perlu memanipulasi
$PATH
lagi!Dari [email protected] , npm dikirimkan bersama
npx
paket yang memungkinkan Anda menjalankan perintah darinode_modules/.bin
cache lokal atau dari cache pusat.Cukup jalankan:
Secara default,
npx
akan memeriksa apakah<command>
ada di$PATH
, atau dalam binari proyek lokal, dan menjalankannya.Memanggil
npx <command>
ketika<command>
belum ada di Anda$PATH
akan secara otomatis menginstal paket dengan nama itu dari registri NPM untuk Anda, dan memintanya. Setelah selesai, paket yang terinstal tidak akan ada di mana pun di global Anda, sehingga Anda tidak perlu khawatir tentang polusi dalam jangka panjang. Anda dapat mencegah perilaku ini dengan memberikan--no-install
opsi.Untuk
npm < 5.2.0
, Anda dapat menginstalnpx
paket secara manual dengan menjalankan perintah berikut:sumber
npm
danpackage.json
menyediakan fungsionalitas yang hampir sama.npx
itu lumpuh. Seharusnyanpm run
ataunpm exec
atau sesuatu.npm run [my-local-package]
tidak berfungsi di Ubuntu saya, meskipun sepertinya berfungsi pada perangkat Windows.Gunakan
npm bin
perintah untuk mendapatkan modul modul / direktori bin dari proyek Andamisalnya
sumber
export PATH="./node_modules/.bin:$PATH"
$(npm bin)/jasmine
, tidaknode $(npm bin)/jasmine
(Anda mungkin mengetahuinya tetapi mengklarifikasi untuk orang lain).Menggunakan
npm run[-script] <script name>
Setelah menggunakan npm untuk menginstal paket nampan ke
./node_modules
direktori lokal Anda , modifikasipackage.json
untuk menambahkan<script name>
seperti ini:Akan lebih baik jika instalasi npm memiliki opsi --add-script atau sesuatu atau jika npm run akan berfungsi tanpa menambahkan ke blok skrip.
sumber
npm install
saat itu Anda memiliki akses ke dependensi dev Anda. Satu-satunya kelemahan adalah Anda perlunpm run eslint
(atau apa pun). Anda dapat membuat skrip yang disebut "mulai" yang menjalankan tegukan sehingga Anda hanya perlu mengetiknpm start
untuk memulai server dev Anda. Cukup keren dan tidak ada pesta, jadi teman-teman windows Anda masih menyukaimu. :)--
seperti:npm run learnyounode -- --normal-switches --watch -d *.js
npm run ts-node
tidak berfungsi untuk saya. Saya hanya harus ressort ke npx.Gunakan
npm-run
.Dari readme:
npm-run
Temukan & jalankan executable lokal dari node_modules
Setiap executable tersedia untuk skrip siklus hidup npm tersedia untuk
npm-run
.Pemakaian
Instalasi
sumber
Pembaruan: Saya tidak lagi merekomendasikan metode ini, baik untuk alasan keamanan yang disebutkan dan yang paling baru
npm bin
perintah yang . Jawaban asli di bawah ini:Seperti yang Anda ketahui, semua binari yang diinstal secara lokal ada di
./node_modules/.bin
. Agar selalu menjalankan binari dalam direktori ini daripada binari yang tersedia secara global, jika ada, saya sarankan Anda menempatkan./node_modules/.bin
dulu di jalur Anda:Jika Anda memasukkan ini ke dalam
~/.profile
,coffee
akan selalu ada./node_modules/.bin/coffee
jika tersedia, jika tidak/usr/local/bin/coffee
(atau awalan apa pun yang Anda instal modul node).sumber
./node_modules/.bin/coffee --output lib/ --compile --bare --watch src
/tmp
), setiap proses atau pengguna dapat membajak sesi Anda dengan menempatkan versi berbahaya perintah biasa (sepertils
,cp
, dll) ada. Ini mungkin menelurkan sub-shell 'tidak terlihat' yang menangkap kata sandi Anda, dan sebagainya.alias npm-exec='PATH=$(npm bin):$PATH'
adalah jas hujan.PATH
, tetapi yang terakhir (menggunakan$(npm bin)
formulir)? jadi mereka tidak bisa menimpa barang-barang Anda yang sudah ada, dan Anda pasti sudah mempercayai file executable dinpm bin
direktori terlepas dariPATH
var; akankah model ancamannya adalah a) seseorang yang jahat mendapat akses ke sistem file Anda, b) mereka menambahkan executable dengan nama yang dekat dengan alat sistem itu, dan c) Anda salah ketik? Mencoba memahami skenario yang memperburuk ini, mengingat Anda sudah mempercayai executable asing ketika menggunakannpm
program -instal.Solusi PATH memiliki masalah bahwa jika $ (npm bin) ditempatkan di .profile / .bashrc / etc Anda, ia dievaluasi sekali dan selamanya disetel ke direktori mana pun jalur tersebut pertama kali dievaluasi. Jika Anda memodifikasi jalur saat ini maka setiap kali Anda menjalankan skrip, jalur Anda akan tumbuh.
Untuk mengatasi masalah ini, saya membuat fungsi dan menggunakannya. Itu tidak mengubah lingkungan Anda dan mudah digunakan:
Ini kemudian dapat digunakan seperti ini tanpa membuat perubahan apa pun pada lingkungan Anda:
sumber
n
Jika Anda ingin tetap npm, maka npx harus melakukan apa yang Anda butuhkan.
Jika beralih ke benang (pengganti npm oleh facebook) adalah pilihan bagi Anda, maka Anda dapat menelepon:
skrip di dalam package.json akan diutamakan, jika tidak ada yang ditemukan akan melihat ke dalam
./node_modules/.bin/
folder.Ini juga menampilkan apa yang dijalankannya:
Jadi Anda tidak perlu mengatur skrip untuk setiap perintah di
package.json
.Jika Anda memiliki skrip yang ditentukan di
.scripts
dalampackage.json
:yarn tsc
akan setara denganyarn run tsc
ataunpm run tsc
:sumber
pembaruan: Jika Anda menggunakan npm terbaru (versi> 5.2)
Kamu bisa menggunakan:
npx
mencari perintah di.bin
direktori Andanode_modules
jawaban lama:
Untuk Windows
Simpan yang berikut dalam file yang dipanggil
npm-exec.bat
dan tambahkan ke file Anda%PATH%
Pemakaian
Maka Anda bisa menggunakannya seperti
npm-exec <command> <arg0> <arg1> ...
Sebagai contoh
Untuk menjalankan
wdio
diinstal di direktori node_modules lokal, lakukan:yaitu akan berjalan
.\node_modules\.bin\wdio wdio.conf.js
sumber
Saya lebih suka untuk tidak mengandalkan alias shell atau paket lain.
Menambahkan baris sederhana ke
scripts
bagian Andapackage.json
, Anda dapat menjalankan perintah npm lokal sepertinpm run webpack
package.json
sumber
Jika Anda ingin variabel PATH Anda diperbarui dengan benar berdasarkan direktori kerja Anda saat ini, tambahkan ini ke akhir
.bashrc
-equivalent Anda (atau setelah apa pun yang mendefinisikanPATH
):Ini dapat menambahkan penundaan singkat setiap kali bash prompt diberikan (tergantung pada ukuran proyek Anda, kemungkinan besar), sehingga dinonaktifkan secara default.
Anda dapat mengaktifkan dan menonaktifkannya di dalam terminal Anda dengan menjalankan
node-mode
dannode-mode-off
, masing-masing.sumber
Saya selalu menggunakan pendekatan yang sama dengan @guneysus untuk menyelesaikan masalah ini, yaitu membuat skrip di file package.json dan menggunakannya menjalankan npm run script-name.
Namun, dalam beberapa bulan terakhir saya telah menggunakan npx dan saya menyukainya.
Misalnya, saya mengunduh proyek Angular dan saya tidak ingin menginstal CLI Angular secara global. Jadi, dengan npx terinstal, daripada menggunakan perintah global angular cli (jika saya telah menginstalnya) seperti ini:
Saya dapat melakukan ini dari konsol:
Inilah artikel yang saya tulis tentang NPX dan itu masuk lebih dalam ke dalamnya.
sumber
zxc seperti "bundle exec" untuk nodejs. Ini mirip dengan menggunakan
PATH=$(npm bin):$PATH
:sumber
Solusi yang sama @ regular diterima, tetapi rasa Ikan shell
sumber
Anda juga dapat menggunakan direnv dan mengubah variabel $ PATH hanya di folder kerja Anda.
sumber
Tambahkan skrip ini ke
.bashrc
. Kemudian Anda dapat meneleponcoffee
atau melakukan apa saja secara lokal. Ini berguna untuk laptop Anda, tetapi jangan menggunakannya di server Anda.Catatan : skrip ini membuat alias
cd
perintah, dan setelah setiap panggilancd
memeriksanode_modules/.bin
dan menambahkannya ke$PATH
.note2 : Anda dapat mengubah baris ketiga menjadi
NODE_MODULES=$(npm bin);
. Tapi itu akan membuatcd
perintah terlalu lambat.sumber
$(npm bin)
sebagai ganti hardcoding./node_modules/.bin
.$(npm bin)
sepertinya terlalu lambat untuk digunakan dengan setiapcd
perintah. Saya telah mengembalikan kode dan menambahkan catatan untuk itu.Untuk Windows gunakan ini:
sumber
Saya mengalami masalah yang sama dan saya tidak begitu suka menggunakan alias (seperti biasa 's disarankan), dan jika Anda tidak seperti mereka juga maka di sini adalah solusi lain yang saya gunakan, pertama Anda harus membuat script bash executable kecil, katakan setenv.sh :
dan kemudian Anda dapat menggunakan executable apa pun di lokal Anda
/bin
menggunakan perintah ini:Jika Anda menggunakan
scripts
dalam package.json maka:sumber
Saya ingin tahu apakah ini ide yang tidak aman / buruk, tetapi setelah memikirkannya sedikit, saya tidak melihat masalah di sini:
Memodifikasi solusi tidak aman Linus untuk menambahkannya ke akhir, menggunakan
npm bin
untuk menemukan direktori, dan membuat skrip panggilan hanyanpm bin
ketikapackage.json
ada di orangtua (untuk kecepatan), inilah yang saya buat untukzsh
:Karena
bash
, alih-alih menggunakanprecmd
pengait, Anda dapat menggunakan$PROMPT_COMMAND
variabel (saya belum menguji ini tetapi Anda mendapatkan ide):sumber
npm bin
ke akhir$PATH
mungkin tidak menjalankan apa yang diharapkan pengguna: pada dasarnya paket lain yang dapat dieksekusi tetapi lebih mungkin diinstal secara global dengan versi lain!Saya adalah
Windows
pengguna dan inilah yang bekerja untuk saya:Semoga berhasil.
sumber
Jika Anda menggunakan
fish shell
dan tidak ingin menambah$path
karena alasan keamanan. Kita dapat menambahkan fungsi di bawah ini untuk menjalankan executable simpul lokal.Sekarang Anda dapat menjalankan hal seperti:
n coffee
atau lebih banyak argumen seperti:
n browser-sync --version
Catatan, jika Anda
bash
pengguna, maka @ Bob9630 jawaban adalah cara untuk meningkatkannya dengan memanfaatkan bash's$@
, yang tidak tersedia difishshell
.sumber
Sertakan skrip kopi di package.json dengan versi spesifik yang diperlukan di setiap proyek, biasanya seperti ini:
Kemudian jalankan npm install untuk menginstal dependensi di setiap proyek. Ini akan menginstal versi kopi-skrip yang ditentukan yang akan dapat diakses secara lokal untuk setiap proyek.
sumber
npm install svgo
juganpm install
dengan package.json. Kedua metode menginstal "berhasil", tetapi perintah "svgo" masih belum tersedia.grunt-cli
paket secara global, kemudian di direktori proyek Anda instal versi (modifikasi) darigrunt
paket tersebut, kemudian ketika Anda menjalankannyagrunt
, ia akan menggunakan versi lokal ini.