Bagaimana cara menggunakan executable dari paket yang diinstal secara lokal di node_modules?

493

Bagaimana cara menggunakan versi lokal modul di node.js. Misalnya, di aplikasi saya, saya menginstal skrip kopi:

npm install coffee-script

Ini menginstalnya ./node_modulesdan 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 execdi bundler. Pada dasarnya, saya ingin menentukan versi naskah kopi yang semua orang yang terlibat dengan proyek harus menggunakan.

Saya tahu saya dapat menambahkan -gbendera untuk menginstalnya secara global sehingga kopi berfungsi dengan baik di mana saja, tetapi bagaimana jika saya ingin memiliki versi kopi yang berbeda per proyek?

typeoneerror
sumber
9
Banyak instruksi yang saya baca mengatakan hal-hal seperti npm install niftycommanddan kemudian niftycommand. Tetapi ini tidak akan berhasil kecuali Anda memiliki ./node_modules/.bin di jalur Anda, bukan?
Bennett McElwee
2
Ada langganan yang sangat bagus di sini: firstdoit.com/... - Pada dasarnya ini merekomendasikan Anda untuk memasukkan coffeeperintah Anda ke dalam npm scriptsbagian, seperti "build": "coffee -co target/directory source/directoy", so you can run npm run build` dari terminal sesudahnya.
Benny Neugebauer
@ BennyNeugebauer memang, itulah yang saya lakukan akhir-akhir ini bukannya main-main dengan PATH
typeoneerror
12
Gunakan npxyang datang dengan npm 5.2.0 medium.com/@maybekatz/…
onmyway133

Jawaban:

568

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

./node_modules/.bin

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

npm bin

Untuk menjalankan coffeebiner yang diinstal secara lokal di mana Anda berada dalam hierarki direktori proyek, Anda dapat menggunakan konstruk bash ini

PATH=$(npm bin):$PATH coffee

Saya alias ini untuk npm-exec

alias npm-exec='PATH=$(npm bin):$PATH'

Jadi, sekarang saya bisa

npm-exec coffee

untuk menjalankan kopi yang benar di mana pun saya berada

$ pwd
/Users/regular/project1

$ npm-exec which coffee
/Users/regular/project1/node_modules/.bin/coffee

$ cd lib/
$ npm-exec which coffee
/Users/regular/project1/node_modules/.bin/coffee

$ cd ~/project2
$ npm-exec which coffee
/Users/regular/project2/node_modules/.bin/coffee
reguler
sumber
17
Anda bahkan dapat melangkah lebih jauh danalias coffee="npm-exec coffee"
reguler
6
Output berubah ketika Anda melakukan cd ke proyek lain. Itu tidak berubah ketika Anda melakukan cd dalam suatu proyek. npm binmencari 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.
reguler
11
ya ampun! apakah saya benar-benar harus melakukan sesuatu seperti itu agar modul lokal saya berfungsi? cukup tidak praktis untuk menjelaskannya kepada tim! tidak ada yang lebih mudah?
Alexian
17
Anda selalu dapat menggunakan skrip npm karena mereka selalu mencari binari lokal terlebih dahulu. Anda dapat mengatur alias ke masing-masing binari Anda di sana atau cukup menggunakan nama generik seperti "build".
Joe Zim
6
@ philosodad, sebenarnya tidak, Anda tidak. The PATHakan kembali ke apa itu sebelum doa perintah. Mengatur variabel lingkungan di baris yang sama, sebelum menjalankan perintah hanya memengaruhi lingkungan perintah itu.
reguler
410

Contoh yang bagus

Anda tidak perlu memanipulasi $PATHlagi!

Dari [email protected] , npm dikirimkan bersama npxpaket yang memungkinkan Anda menjalankan perintah dari node_modules/.bincache lokal atau dari cache pusat.

Cukup jalankan:

$ npx [options] <command>[@version] [command-arg]...

Secara default, npxakan memeriksa apakah <command>ada di $PATH, atau dalam binari proyek lokal, dan menjalankannya.

Memanggil npx <command>ketika <command>belum ada di Anda $PATHakan 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-installopsi.

Untuk npm < 5.2.0, Anda dapat menginstal npxpaket secara manual dengan menjalankan perintah berikut:

$ npm install -g npx
Seyeong Jeong
sumber
1
Saya tidak suka menginstal paket npm global pihak ke-3 sementara npmdan package.jsonmenyediakan fungsionalitas yang hampir sama.
guneysus
Jika pesan "Path harus berupa string. Diterima tidak terdefinisi" muncul, berikut ini adalah perbaikan: github.com/zkat/npx/issues/144#issuecomment-391031816
Valeriy Katkov
1
Jawaban ini bagus. Tapi aku hanya ingin mengatakan npxitu lumpuh. Seharusnya npm runatau npm execatau sesuatu.
William Entriken
@WilliamEntriken Untuk beberapa alasan, npm run [my-local-package]tidak berfungsi di Ubuntu saya, meskipun sepertinya berfungsi pada perangkat Windows.
Clockwork
97

Gunakan npm binperintah untuk mendapatkan modul modul / direktori bin dari proyek Anda

$ $(npm bin)/<binary-name> [args]

misalnya

$ $(npm bin)/bower install
jassa
sumber
4
Saya suka solusi sederhana dan generik ini. Membuat alias tidak perlu.
Matt Montag
Tampaknya menjadi solusi terbaik berikutnya yang elegan dan lebih aman daripada harus melakukanexport PATH="./node_modules/.bin:$PATH"
jontsai
1
@ inf3rno perintahnya adalah $(npm bin)/jasmine, tidak node $(npm bin)/jasmine(Anda mungkin mengetahuinya tetapi mengklarifikasi untuk orang lain).
jassa
5
Bukan solusi yang buruk, tetapi tidak berjalan pada baris perintah windows standar dengan $. Menempatkannya di bagian script package.json adalah pendekatan yang lebih baik, saya rasa, karena lebih kompatibel.
Timothy Gonzalez
77

Menggunakan npm run[-script] <script name>

Setelah menggunakan npm untuk menginstal paket nampan ke ./node_modulesdirektori lokal Anda , modifikasi package.jsonuntuk menambahkan <script name>seperti ini:

$ npm install --save learnyounode
$ edit packages.json
>>> in packages.json
...
"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "learnyounode": "learnyounode"
},
...
$ npm run learnyounode

Akan lebih baik jika instalasi npm memiliki opsi --add-script atau sesuatu atau jika npm run akan berfungsi tanpa menambahkan ke blok skrip.

jla
sumber
5
Saya menemukan pendekatan ini menjadi lebih seragam ketika berhadapan dengan banyak pengembang pada suatu proyek - itu menghindari kebutuhan untuk mengkonfigurasi apa pun secara lokal ... Anda npm installsaat itu Anda memiliki akses ke dependensi dev Anda. Satu-satunya kelemahan adalah Anda perlu npm run eslint(atau apa pun). Anda dapat membuat skrip yang disebut "mulai" yang menjalankan tegukan sehingga Anda hanya perlu mengetik npm startuntuk memulai server dev Anda. Cukup keren dan tidak ada pesta, jadi teman-teman windows Anda masih menyukaimu. :)
jpoveda
1
menambahkan alias untuk meletakkan $ (npm bin) di jalan Anda pintar, tetapi kenyataan bahwa ini akan bekerja untuk orang-orang tanpa konfigurasi lokal memenangkan hati saya
Conrad.Dean
12
ini membutuhkan lebih banyak upvotes! Berikan args ke skrip Anda setelah --seperti:npm run learnyounode -- --normal-switches --watch -d *.js
ptim
Saya juga menemukan ini solusi terbaik. Ada penjelasan mendalam di sini: lostechies.com/derickbailey/2012/04/24/…
adampasz
1
Ini yang biasanya saya gunakan, tetapi untuk beberapa alasan, pada perangkat Ubuntu, npm run ts-nodetidak berfungsi untuk saya. Saya hanya harus ressort ke npx.
Clockwork
42

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

$ npm install mocha # mocha installed in ./node_modules
$ npm-run mocha test/* # uses locally installed mocha executable 

Instalasi

$ npm install -g npm-run
perkasa
sumber
8
Tidak lagi, lihat npx yang dirujuk di atas ... stackoverflow.com/a/45164863/3246805
tj
41

Pembaruan: Saya tidak lagi merekomendasikan metode ini, baik untuk alasan keamanan yang disebutkan dan yang paling barunpm 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/.bindulu di jalur Anda:

export PATH="./node_modules/.bin:$PATH"

Jika Anda memasukkan ini ke dalam ~/.profile, coffeeakan selalu ada ./node_modules/.bin/coffeejika tersedia, jika tidak /usr/local/bin/coffee(atau awalan apa pun yang Anda instal modul node).

Linus Gustav Larsson Thiel
sumber
1
itu mungkin solusi terbaik. Saya juga membuat skrip bash yang disebut "watch" di proyek saya:./node_modules/.bin/coffee --output lib/ --compile --bare --watch src
typeoneerror
72
Bahaya, Will Robinson! Penggunaan jalur relatif di $ PATH Anda membuka lubang keamanan seukuran planet, terutama jika Anda menempatkannya tepat di depan sebagai item pertama. Jika direktori Anda berada di dapat ditulis oleh semua orang (mengatakan di suatu tempat di /tmp), setiap proses atau pengguna dapat membajak sesi Anda dengan menempatkan versi berbahaya perintah biasa (seperti ls, cp, dll) ada. Ini mungkin menelurkan sub-shell 'tidak terlihat' yang menangkap kata sandi Anda, dan sebagainya.
ack
hanya akan bekerja di root dan tidak ada tempat lain. yang alias npm-exec='PATH=$(npm bin):$PATH'adalah jas hujan.
oligofren
1
Seberapa buruk ini jika Anda tidak meletakkannya sebagai hal pertama di Anda 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 di npm bindirektori terlepas dari PATHvar; 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 menggunakan npmprogram -instal.
osdiab
Anda dapat melakukan trik shell dengan alias dan Anda dapat path secara manual dan ini "berfungsi" tetapi tidak cukup ideal.
killscreen
22

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:

function npm-exec {
   $(npm bin)/$@  
}

Ini kemudian dapat digunakan seperti ini tanpa membuat perubahan apa pun pada lingkungan Anda:

npm-exec r.js <args>
Bob9630
sumber
2
Saya suka ini! Saya hanya menyebutkan fungsi sayan
jontsai
Ini bagus! Terima kasih telah berbagi. Saya menambahkan versi kulit ikan di bawah ini.
LeOn - Han Li
22

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:

 yarn yourCmd

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:

$ yarn tsc
yarn tsc v0.27.5
$ "/home/philipp/rate-pipeline/node_modules/.bin/tsc"

Jadi Anda tidak perlu mengatur skrip untuk setiap perintah di package.json.


Jika Anda memiliki skrip yang ditentukan di .scriptsdalam package.json:

"tsc": "tsc" // each command defined in the scripts will be executed from `./node_modules/.bin/` first

yarn tscakan setara dengan yarn run tscatau npm run tsc:

 yarn tsc
 yarn tsc v0.27.5
 $ tsc
k0pernikus
sumber
14

pembaruan: Jika Anda menggunakan npm terbaru (versi> 5.2)

Kamu bisa menggunakan:

npx <command>

npxmencari perintah di .bindirektori Andanode_modules

jawaban lama:

Untuk Windows

Simpan yang berikut dalam file yang dipanggil npm-exec.batdan tambahkan ke file Anda%PATH%

@echo off
set cmd="npm bin"
FOR /F "tokens=*" %%i IN (' %cmd% ') DO SET modules=%%i
"%modules%"\%*

Pemakaian

Maka Anda bisa menggunakannya seperti npm-exec <command> <arg0> <arg1> ...

Sebagai contoh

Untuk menjalankan wdiodiinstal di direktori node_modules lokal, lakukan:

npm-exec wdio wdio.conf.js

yaitu akan berjalan .\node_modules\.bin\wdio wdio.conf.js

Dheeraj Bhaskar
sumber
Ini tidak berfungsi saat melewati lebih dari 1 argumen. Misalnya npm-exec menelan <some_task>
OK999
@ OK9999 Saya yakin beberapa modifikasi kecil akan memungkinkan lewat argumen (karena ketika Anda meneruskannya di sini, itu datang dikutip dalam ""); Apa yang saya sarankan adalah salin tempelkan file gulp dari bin ke root proyek Anda (beberapa modifikasi diperlukan dari file tersebut, tetapi itu hanya akan berfungsi tanpa menulis kode baru dll)
Dheeraj Bhaskar
Ya, saya akhirnya melakukannya. Folder node_modules harus berada di folder tempat gulpfile ada
OK999
7

Saya lebih suka untuk tidak mengandalkan alias shell atau paket lain.

Menambahkan baris sederhana ke scriptsbagian Anda package.json, Anda dapat menjalankan perintah npm lokal seperti

npm run webpack

package.json

{
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "webpack": "webpack"
  },
  "devDependencies": {
    "webpack": "^4.1.1",
    "webpack-cli": "^2.0.11"
  }
}
guneysus
sumber
5

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 mendefinisikan PATH):

__OLD_PATH=$PATH
function updatePATHForNPM() {
  export PATH=$(npm bin):$__OLD_PATH
}

function node-mode() {
  PROMPT_COMMAND=updatePATHForNPM
}

function node-mode-off() {
  unset PROMPT_COMMAND
  PATH=$__OLD_PATH
}

# Uncomment to enable node-mode by default:
# node-mode

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-modedan node-mode-off, masing-masing.

namuol
sumber
4

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:

ng serve

Saya dapat melakukan ini dari konsol:

npx ng serve

Inilah artikel yang saya tulis tentang NPX dan itu masuk lebih dalam ke dalamnya.

Jair Reina
sumber
2

zxc seperti "bundle exec" untuk nodejs. Ini mirip dengan menggunakan PATH=$(npm bin):$PATH:

$ npm install -g zxc
$ npm install gulp
$ zxc which gulp
/home/nathan/code/project1/node_modules/.bin/gulp
Nathan
sumber
2

Solusi yang sama @ regular diterima, tetapi rasa Ikan shell

if not contains (npm bin) $PATH
    set PATH (npm bin) $PATH
end
Langit Pionir
sumber
1

Anda juga dapat menggunakan direnv dan mengubah variabel $ PATH hanya di folder kerja Anda.

$ cat .envrc
> export PATH=$(npm bin):$PATH
Erem
sumber
1

Tambahkan skrip ini ke .bashrc. Kemudian Anda dapat menelepon coffeeatau melakukan apa saja secara lokal. Ini berguna untuk laptop Anda, tetapi jangan menggunakannya di server Anda.

DEFAULT_PATH=$PATH;

add_local_node_modules_to_path(){
  NODE_MODULES='./node_modules/.bin';
  if [ -d $NODE_MODULES ]; then
    PATH=$DEFAULT_PATH:$NODE_MODULES;
  else
    PATH=$DEFAULT_PATH;
  fi
}

cd () {
  builtin cd "$@";
  add_local_node_modules_to_path;
}

add_local_node_modules_to_path;

Catatan : skrip ini membuat alias cdperintah, dan setelah setiap panggilan cdmemeriksa node_modules/.bindan menambahkannya ke$PATH .

note2 : Anda dapat mengubah baris ketiga menjadi NODE_MODULES=$(npm bin);. Tapi itu akan membuat cdperintah terlalu lambat.

Tsutomu Kawamura
sumber
1
Gunakan $(npm bin)sebagai ganti hardcoding ./node_modules/.bin.
bfontaine
Hmm, $(npm bin)sepertinya terlalu lambat untuk digunakan dengan setiap cdperintah. Saya telah mengembalikan kode dan menambahkan catatan untuk itu.
Tsutomu Kawamura
1

Untuk Windows gunakan ini:

/* cmd into "node_modules" folder */
"%CD%\.bin\grunt" --version
b3wii
sumber
0

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 :

#!/bin/sh

# Add your local node_modules bin to the path
export PATH="$(npm bin):$PATH"

# execute the rest of the command
exec "$@"

dan kemudian Anda dapat menggunakan executable apa pun di lokal Anda /binmenggunakan perintah ini:

./setenv.sh <command>
./setenv.sh 6to5-node server.js
./setenv.sh grunt

Jika Anda menggunakan scriptsdalam package.json maka:

...,
scripts: {
    'start': './setenv.sh <command>'
}
nkh
sumber
2
skrip setenv ini tidak diperlukan untuk skrip package.json. npm sudah menambahkan direktori lokal node_modules / .bin ke path untuk Anda ketika mengeksekusi npm jalankan {scripts}.
jasonkarns
0

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 binuntuk menemukan direktori, dan membuat skrip panggilan hanya npm binketika package.jsonada di orangtua (untuk kecepatan), inilah yang saya buat untuk zsh:

find-up () {
  path=$(pwd)
  while [[ "$path" != "" && ! -e "$path/$1" ]]; do
    path=${path%/*}
  done
  echo "$path"
}

precmd() {
  if [ "$(find-up package.json)" != "" ]; then
    new_bin=$(npm bin)
    if [ "$NODE_MODULES_PATH" != "$new_bin" ]; then
      export PATH=${PATH%:$NODE_MODULES_PATH}:$new_bin
      export NODE_MODULES_PATH=$new_bin
    fi
  else
    if [ "$NODE_MODULES_PATH" != "" ]; then
      export PATH=${PATH%:$NODE_MODULES_PATH}
      export NODE_MODULES_PATH=""
    fi
  fi
}

Karena bash, alih-alih menggunakan precmdpengait, Anda dapat menggunakan $PROMPT_COMMANDvariabel (saya belum menguji ini tetapi Anda mendapatkan ide):

__add-node-to-path() {
  if [ "$(find-up package.json)" != "" ]; then
    new_bin=$(npm bin)
    if [ "$NODE_MODULES_PATH" != "$new_bin" ]; then
      export PATH=${PATH%:$NODE_MODULES_PATH}:$new_bin
      export NODE_MODULES_PATH=$new_bin
    fi
  else
    if [ "$NODE_MODULES_PATH" != "" ]; then
      export PATH=${PATH%:$NODE_MODULES_PATH}
      export NODE_MODULES_PATH=""
    fi
  fi   
}

export PROMPT_COMMAND="__add-node-to-path"
osdiab
sumber
Menambahkan npm binke akhir $PATHmungkin tidak menjalankan apa yang diharapkan pengguna: pada dasarnya paket lain yang dapat dieksekusi tetapi lebih mungkin diinstal secara global dengan versi lain!
LoganMzz
0

Saya adalah Windowspengguna dan inilah yang bekerja untuk saya:

// First set some variable - i.e. replace is with "xo"
D:\project\root> set xo="./node_modules/.bin/"

// Next, work with it
D:\project\root> %xo%/bower install

Semoga berhasil.

Akash
sumber
0

Jika Anda menggunakan fish shelldan tidak ingin menambah $pathkarena alasan keamanan. Kita dapat menambahkan fungsi di bawah ini untuk menjalankan executable simpul lokal.

### run executables in node_module/.bin directory
function n 
  set -l npmbin (npm bin)   
  set -l argvCount (count $argv)
  switch $argvCount
    case 0
      echo please specify the local node executable as 1st argument
    case 1
      # for one argument, we can eval directly 
      eval $npmbin/$argv
    case '*'
      set --local executable $argv[1]
      # for 2 or more arguments we cannot append directly after the $npmbin/ since the fish will apply each array element after the the start string: $npmbin/arg1 $npmbin/arg2... 
      # This is just how fish interoperate array. 
      set --erase argv[1]
      eval $npmbin/$executable $argv 
  end
end

Sekarang Anda dapat menjalankan hal seperti:

n coffee

atau lebih banyak argumen seperti:

n browser-sync --version

Catatan, jika Anda bashpengguna, maka @ Bob9630 jawaban adalah cara untuk meningkatkannya dengan memanfaatkan bash's $@, yang tidak tersedia di fishshell.

LeOn - Han Li
sumber
-9

Sertakan skrip kopi di package.json dengan versi spesifik yang diperlukan di setiap proyek, biasanya seperti ini:

"dependencies":{
  "coffee-script": ">= 1.2.0"

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.

almypal
sumber
ya, saya sampai sejauh yang saya nyatakan dalam pertanyaan saya. bagaimana saya secara spesifik memanggil yang ada di proyek saya selain ./node_modules/.bin/coffee?
typeoneerror
Jika Anda telah menjalankan instalasi npm dengan package.json di folder utama proyek Anda, Anda harus memiliki folder ./node_modules/.bin/coffee di folder ini. Menggunakan ./node_modules/coffee-script/bin/coffee akan menjalankan versi lokal kopi sementara hanya menjalankan kopi akan menjalankan instalasi global. Jika Anda memiliki versi kopi lain yang dipasang di jalur lain di dalam folder proyek ini, Anda dapat mengaksesnya menggunakan ./path/to/ini/instalasi/coffee.
almypal
Ini tidak berhasil untuk saya. Saya mencoba menggunakan "svgo", dan itu hanya berfungsi ketika diinstal secara global. Saya telah mencoba npm install svgojuga npm installdengan package.json. Kedua metode menginstal "berhasil", tetapi perintah "svgo" masih belum tersedia.
Ryan Wheale
1
Grunt menggunakan ini dengan cara yang cerdas, dan IMHO juga harus paket lain. Pertama Anda menginstal grunt-clipaket secara global, kemudian di direktori proyek Anda instal versi (modifikasi) dari gruntpaket tersebut, kemudian ketika Anda menjalankannya grunt, ia akan menggunakan versi lokal ini.
ack