Làm thế nào để sử dụng các tệp thực thi từ một gói được cài đặt cục bộ trong node_modules?


493

Làm cách nào để sử dụng phiên bản cục bộ của mô-đun node.js. Ví dụ: trong ứng dụng của mình, tôi đã cài đặt tập lệnh cà phê:

npm install coffee-script

Điều này cài đặt nó trong ./node_modulesvà lệnh cà phê là trong ./node_modules/.bin/coffee. Có cách nào để chạy lệnh này khi tôi đang ở trong thư mục chính của dự án không? Tôi đoán tôi đang tìm kiếm một cái gì đó tương tự như bundle exectrong bundler. Về cơ bản, tôi muốn chỉ định một phiên bản kịch bản cà phê mà mọi người tham gia dự án nên sử dụng.

Tôi biết tôi có thể thêm -gcờ để cài đặt nó trên toàn cầu để cà phê hoạt động tốt ở mọi nơi, nhưng nếu tôi muốn có các phiên bản cà phê khác nhau cho mỗi dự án thì sao?


9
Rất nhiều hướng dẫn tôi đọc nói những điều như npm install niftycommandvà sau đó niftycommand. Nhưng điều này sẽ không bao giờ hoạt động trừ khi bạn có ./node_modules/.bin trong đường dẫn của bạn, phải không?
Bennett McElwee

2
Có một bài viết rất hay ở đây: firstdoit.com/ - Về cơ bản, nó khuyên bạn nên đưa coffeelệnh của mình vào npm scriptsphần này, như "build": "coffee -co target/directory source/directoy", so you can run npm chạy build` từ thiết bị đầu cuối sau đó.
Benny Neugebauer

@BennyNeugebauer thực sự, đó là những gì tôi đã làm gần đây thay vì nhắn tin với PATH
typeoneerror

12
Sử dụng npxđi kèm với npm 5.2.0 Medium.com/@maybekatz/
onmyway133

Câu trả lời:


568

CẬP NHẬT : Như Seyeong Jeong chỉ ra trong câu trả lời của họ dưới đây, kể từ npm 5.2.0 bạn có thể sử dụng npx [command], thuận tiện hơn.

TRẢ LỜI OLD cho các phiên bản trước 5.2.0 :

Vấn đề với việc đặt

./node_modules/.bin

vào PATH của bạn là nó chỉ hoạt động khi thư mục làm việc hiện tại của bạn là gốc của cấu trúc thư mục dự án của bạn (tức là vị trí của node_modules )

Không phụ thuộc vào thư mục làm việc của bạn, bạn có thể nhận đường dẫn của tệp nhị phân được cài đặt cục bộ với

npm bin

Để thực thi một coffeenhị phân được cài đặt cục bộ độc lập với vị trí của bạn trong hệ thống phân cấp thư mục dự án, bạn có thể sử dụng cấu trúc bash này

PATH=$(npm bin):$PATH coffee

Tôi đã đặt bí danh này cho npm-exec

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

Vì vậy, bây giờ tôi có thể

npm-exec coffee

để chạy đúng bản sao của cà phê bất kể tôi đang ở đâu

$ 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

17
bạn thậm chí có thể tiến thêm một bước vàalias coffee="npm-exec coffee"
thường

6
Đầu ra thay đổi khi bạn cd vào một dự án khác. Nó không thay đổi khi bạn cd trong một dự án. npm bintìm kiếm chuỗi 'thư mục tổ tiên' đến cwd cho thư mục node_modules. Đây chính xác là hành vi mong muốn nếu bạn đặc biệt muốn sử dụng các nhị phân của các mô-đun được liệt kê trong gói.json của dự án.
thường xuyên

11
trời ơi! Tôi có thực sự phải làm một cái gì đó như thế để các mô-đun địa phương của tôi hoạt động không? Thật khó để giải thích điều đó với một đội! không có gì đơn giản hơn một chút?
Alexian

17
Bạn luôn có thể sử dụng tập lệnh npm vì chúng luôn tìm kiếm các tệp nhị phân cục bộ trước tiên. Bạn có thể thiết lập bí danh cho từng nhị phân của mình ở đó hoặc chỉ sử dụng các tên chung như "xây dựng".
Joe Zim

6
@philosodad, thực sự là không, bạn thì không. Các PATHsẽ trở lại với những gì nó đã được trước khi gọi lệnh. Đặt biến môi trường trong cùng một dòng, trước khi chạy lệnh chỉ ảnh hưởng đến môi trường của lệnh đó.
thường xuyên

410

Ví dụ đẹp

Bạn không phải thao túng $PATHnữa!

Từ npm@5.2.0 , NPM tàu với npxgói mà cho phép bạn chạy các lệnh từ một địa phươngnode_modules/.bin hoặc từ một bộ nhớ cache trung ương.

Đơn giản chỉ cần chạy:

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

Theo mặc định, npxsẽ kiểm tra xem có <command>tồn tại trong $PATHhoặc trong các nhị phân dự án cục bộ hay không và thực hiện điều đó.

Gọi npx <command>khi <command>chưa có trong bạn $PATHsẽ tự động cài đặt gói có tên đó từ sổ đăng ký NPM cho bạn và gọi nó. Khi hoàn tất, gói đã cài đặt sẽ không ở bất kỳ đâu trên toàn cầu của bạn, vì vậy về lâu dài bạn sẽ không phải lo lắng về ô nhiễm. Bạn có thể ngăn chặn hành vi này bằng cách cung cấp --no-installtùy chọn.

Đối với npm < 5.2.0, bạn có thể cài đặt npxgói thủ công bằng cách chạy lệnh sau:

$ npm install -g npx

1
Tôi không thích cài đặt các gói npm toàn cầu của bên thứ 3 trong khi npmpackage.jsoncung cấp chức năng gần như tương tự.
guneysus

Nếu thông báo "Đường dẫn phải là một chuỗi. Đã nhận không xác định" xuất hiện, đây là một sửa chữa: github.com/zkat/npx/issues/144#issuecomment-391031816
Valeriy Katkov

1
Câu trả lời này là tốt. Nhưng tôi chỉ muốn nói npxlà khập khiễng. Nó cần phải có được npm runhay npm exechoặc một cái gì đó.
William Entriken

@WilliamEntriken Vì một số lý do, npm run [my-local-package]không hoạt động trên Ubuntu của tôi, mặc dù nó dường như hoạt động trên thiết bị Windows.
Đồng hồ

97

Sử dụng npm binlệnh để lấy thư mục mô-đun / bin của dự án

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

ví dụ

$ $(npm bin)/bower install

4
Tôi thích giải pháp đơn giản và chung chung này. Làm cho một bí danh dường như không cần thiết.
Matt Montag

Có vẻ là giải pháp tốt nhất tiếp theo thanh lịch và an toàn hơn là phải làmexport PATH="./node_modules/.bin:$PATH"
jontsai

1
@ inf3rno lệnh là $(npm bin)/jasmine, không node $(npm bin)/jasmine(bạn có thể đã tìm ra nó nhưng làm rõ cho người khác).
jass

5
Không phải là một giải pháp tồi, nhưng nó không chạy trên dòng lệnh windows tiêu chuẩn với $. Đặt nó trong phần script.json là cách tiếp cận tốt hơn tôi cảm thấy, vì nó tương thích hơn.
Timothy Gonzalez

77

Sử dụng npm run[-script] <script name>

Sau khi sử dụng npm để cài đặt gói bin vào ./node_modulesthư mục cục bộ của bạn , hãy sửa đổi package.jsonđể thêm <script name>như thế này:

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

Sẽ thật tuyệt nếu cài đặt npm có tùy chọn --add-script hoặc một cái gì đó hoặc nếu npm chạy sẽ hoạt động mà không cần thêm vào khối script.


5
Tôi thấy cách tiếp cận này thống nhất hơn khi giao dịch với nhiều nhà phát triển trong một dự án - nó tránh được nhu cầu cấu hình bất cứ thứ gì cục bộ ... khi npm installđó bạn có quyền truy cập vào các phụ thuộc dev của mình. Mặt trái duy nhất là bạn cần npm run eslint(hoặc bất cứ điều gì). Bạn có thể tạo một tập lệnh gọi là "bắt đầu" chạy gulp để bạn chỉ cần gõ npm startđể khởi động máy chủ dev của mình. Công cụ khá mát mẻ và không có bash lòng tốt, vì vậy bạn bè windows của bạn vẫn thích bạn. :)
jpoveda

1
thêm một bí danh để đặt $ (npm bin) trên đường dẫn của bạn là thông minh, nhưng thực tế là điều này sẽ hiệu quả với những người không có cấu hình cục bộ chiếm được cảm tình của tôi
Conrad.Dean

12
cái này cần nhiều upvote hơn! Vượt qua các kịch bản của bạn sau khi --thích:npm run learnyounode -- --normal-switches --watch -d *.js
ptim

Tôi cũng thấy đây là giải pháp tốt nhất. Có một lời giải thích sâu sắc ở đây: Lostechies.com/derickbailey/2012/04/24/ trên
adampasz 24/07/2016

1
Đây là những gì tôi thường làm, nhưng vì một số lý do, trên thiết bị Ubuntu, npm run ts-nodekhông hoạt động với tôi. Tôi sẽ phải đánh giá lại npx.
Đồng hồ

42

Sử dụng npm-run .

Từ bài đọc:

npm-run

Tìm và chạy các tệp thực thi cục bộ từ node_modules

Bất kỳ tập tin thực thi nào có sẵn cho tập lệnh vòng đời npm đều khả dụng npm-run .

Sử dụng

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

Cài đặt

$ npm install -g npm-run

8
Không còn nữa, hãy xem npx được tham chiếu ở trên ... stackoverflow.com/a/45164863/3246805
tj

41

Cập nhật: Tôi không còn đề xuất phương pháp này, cả vì lý do bảo mật đã đề cập và không phải là npm binlệnh mới nhất . Câu trả lời gốc dưới đây:

Như bạn đã tìm ra, bất kỳ nhị phân nào được cài đặt cục bộ đều nằm trong ./node_modules/.bin. Để luôn luôn chạy nhị phân trong thư mục này thay vì nhị phân có sẵn trên toàn cầu, nếu có, tôi khuyên bạn nên đặt ./node_modules/.binđầu tiên trong đường dẫn của mình:

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

Nếu bạn đặt cái này vào ~/.profile, coffeesẽ luôn luôn ./node_modules/.bin/coffeecó sẵn, nếu không /usr/local/bin/coffee(hoặc bất kỳ tiền tố nào bạn đang cài đặt các mô-đun nút bên dưới).


1
đó có lẽ là giải pháp tốt nhất Tôi cũng đã tạo một tập lệnh bash có tên là "watch" trong dự án của mình:./node_modules/.bin/coffee --output lib/ --compile --bare --watch src
typeoneerror

72
Nguy hiểm, Will Robinson! Việc sử dụng các đường dẫn tương đối trong $ PATH của bạn sẽ mở ra một lỗ hổng bảo mật có kích thước của một hành tinh, đặc biệt nếu bạn đặt chúng ở phía trước làm vật phẩm đầu tiên. Nếu thư mục bạn đang ở là có thể ghi bởi tất cả mọi người (nói ở đâu đó trong /tmp), bất kỳ quá trình hoặc người dùng có thể chiếm quyền điều khiển phiên của bạn bằng cách đặt các phiên bản độc hại của các lệnh thông thường (như ls, cp, vv) ở đó. Chúng có thể sinh ra các lớp vỏ phụ "vô hình" để lấy mật khẩu của bạn, vân vân.
ack

sẽ chỉ hoạt động trong thư mục gốc và không có nơi nào khác. những alias npm-exec='PATH=$(npm bin):$PATH'là áo mưa.
oligofren

1
Điều này tệ đến mức nào nếu bạn không đặt nó làm điều đầu tiên trong bạn PATH, nhưng là điều cuối cùng (sử dụng $(npm bin)biểu mẫu)? vì vậy họ không thể ghi đè lên nội dung hiện có của bạn và bạn đã tin tưởng các tệp thực thi trong npm binthư mục đã bất kể PATHvar; mô hình mối đe dọa sẽ là a) ai đó độc hại có quyền truy cập vào hệ thống tệp của bạn, b) họ thêm các tệp thực thi có tên gần với các công cụ hệ thống đó và c) bạn gõ nhầm? Cố gắng hiểu các tình huống làm cho điều này trở nên tồi tệ, cho rằng bạn đã tin tưởng các thực thi nước ngoài khi sử dụng npmcác chương trình được cài đặt.
osdiab

Bạn có thể thực hiện các thủ thuật shell với bí danh và bạn có thể đường dẫn thủ công và "công việc" này nhưng nó không hoàn toàn lý tưởng.
killscreen 18/12/17

22

Giải pháp PATH có vấn đề là nếu $ (npm bin) được đặt trong .profile / .bashrc / etc thì nó được đánh giá một lần và mãi mãi được đặt thành thư mục nào mà đường dẫn được đánh giá đầu tiên. Nếu thay vào đó bạn sửa đổi đường dẫn hiện tại Mỗi khi bạn chạy tập lệnh, đường dẫn của bạn sẽ phát triển.

Để giải quyết những vấn đề này, tôi tạo một hàm và sử dụng nó. Nó không sửa đổi môi trường của bạn và sử dụng đơn giản:

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

Điều này sau đó có thể được sử dụng như thế này mà không thực hiện bất kỳ thay đổi nào đối với môi trường của bạn:

npm-exec r.js <args>

2
Tôi thích điều này! Tôi chỉ đơn giản đặt tên cho chức năng của mìnhn
jontsai

Điều đó thật tuyệt! Cám ơn vì đã chia sẻ. Tôi đã thêm một phiên bản vỏ cá dưới đây.
LeOn - Han Li

22

Nếu bạn muốn giữ npm, thì npx nên làm những gì bạn cần.


Nếu chuyển sang sợi (thay thế npm bằng facebook) là một tùy chọn cho bạn, thì bạn có thể gọi:

 yarn yourCmd

các tập lệnh bên trong gói.json sẽ được ưu tiên, nếu không tìm thấy tập lệnh nào, nó sẽ tìm bên trong ./node_modules/.bin/ thư mục.

Nó cũng xuất ra những gì nó chạy:

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

Vì vậy, bạn không phải thiết lập tập lệnh cho mỗi lệnh trong package.json.


Nếu bạn có một tập lệnh được xác định ở .scriptsbên trong package.json:

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

yarn tscsẽ tương đương với yarn run tschoặc npm run tsc:

 yarn tsc
 yarn tsc v0.27.5
 $ tsc

14

cập nhật: Nếu bạn đang ở npm gần đây (phiên bản> 5.2)

Bạn có thể dùng:

npx <command>

npxtìm kiếm lệnh trong .binthư mục của bạnnode_modules

câu trả lời cũ:

Cho cửa sổ

Lưu trữ sau đây trong một tệp được gọi npm-exec.batvà thêm nó vào của bạn%PATH%

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

Sử dụng

Sau đó, bạn có thể sử dụng nó như npm-exec <command> <arg0> <arg1> ...

Ví dụ

Để thực thi wdiocài đặt trong thư mục node_modules cục bộ, hãy:

npm-exec wdio wdio.conf.js

tức là nó sẽ chạy .\node_modules\.bin\wdio wdio.conf.js


Điều này không hoạt động trong khi vượt qua hơn 1 đối số. Ví dụ: npm-exec gulp <some_task>
OK999

@ OK9999 Tôi chắc chắn rằng một số sửa đổi nhỏ sẽ cho phép chuyển các đối số (vì khi bạn chuyển nó ở đây, nó sẽ được trích dẫn trong ""); Những gì tôi đề xuất là sao chép dán tệp gulp từ bin vào gốc dự án của bạn (một số sửa đổi cần thiết của tệp, nhưng nó sẽ chỉ hoạt động mà không cần viết mã mới, v.v.)
Dheeraj Bhaskar

Vâng, tôi đã kết thúc như vậy. Thư mục node_modules phải nằm trong thư mục tồn tại
gulpfile

6

Tôi không muốn dựa vào bí danh vỏ hoặc gói khác.

Thêm một dòng đơn giản vào scriptsphần của bạn package.json, bạn có thể chạy các lệnh npm cục bộ như

npm run webpack

pack.json

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

5

Nếu bạn muốn biến PATH của bạn cập nhật chính xác dựa trên thư mục làm việc hiện tại của bạn, hãy thêm biến này vào cuối phần .bashrctương đương của bạn (hoặc sau bất cứ điều gì xác định 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

Điều này có thể thêm một độ trễ ngắn mỗi khi dấu nhắc bash được hiển thị (rất có thể tùy thuộc vào kích thước dự án của bạn), do đó, nó bị tắt theo mặc định.

Bạn có thể bật và tắt nó trong thiết bị đầu cuối của mình bằng cách chạy node-modenode-mode-off, tương ứng.


4

Tôi đã luôn sử dụng cách tiếp cận tương tự như @guneysus để giải quyết vấn đề này, đó là tạo một tập lệnh trong tệp pack.json và sử dụng nó để chạy npm chạy tên tập lệnh.

Tuy nhiên, trong những tháng gần đây tôi đã sử dụng npx và tôi thích nó.

Ví dụ: tôi đã tải xuống một dự án Angular và tôi không muốn cài đặt Angular CLI trên toàn cầu. Vì vậy, với npx được cài đặt, thay vì sử dụng lệnh cli góc toàn cầu (nếu tôi đã cài đặt nó) như thế này:

ng serve

Tôi có thể làm điều này từ bảng điều khiển:

npx ng serve

Đây là một bài viết tôi đã viết về NPX và nó đi sâu hơn vào nó.


2

zxc giống như "gói thực thi" cho nodejs. Nó tương tự như sử dụng PATH=$(npm bin):$PATH:

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

2

Cùng một giải pháp được chấp nhận, nhưng hương vị vỏ cá

if not contains (npm bin) $PATH
    set PATH (npm bin) $PATH
end

1

Bạn cũng có thể sử dụng direnv và chỉ thay đổi biến $ PATH trong thư mục làm việc của bạn.

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

1

Thêm tập lệnh này vào của bạn .bashrc. Sau đó, bạn có thể gọi coffeehoặc anyhting địa phương. Điều này rất hữu ích cho máy tính xách tay của bạn, nhưng đừng sử dụng nó trên máy chủ của bạn.

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;

lưu ý : tập lệnh này tạo ra lệnh aliase cdvà sau mỗi lệnh gọi của cdnó sẽ kiểm tra node_modules/.binvà thêm nó vào lệnh của bạn $PATH.

lưu ý2 : bạn có thể thay đổi dòng thứ ba thành NODE_MODULES=$(npm bin);. Nhưng điều đó sẽ làm cho cdlệnh quá chậm.


1
Sử dụng $(npm bin)thay vì mã hóa cứng ./node_modules/.bin.
bfontaine

Hmm, $(npm bin)dường như quá chậm để sử dụng với mỗi cdlệnh. Tôi đã khôi phục mã và thêm một ghi chú cho nó.
Tsutomu Kawamura

1

Đối với Windows, hãy sử dụng:

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

0

Tôi gặp phải vấn đề tương tự và tôi đặc biệt không thích sử dụng bí danh (như đề xuất thông thường ) và nếu bạn cũng không thích chúng thì đây là một cách giải quyết khác mà tôi sử dụng, trước tiên bạn phải tạo một tập lệnh bash nhỏ có thể thực thi được, nói 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 "$@"

và sau đó bạn có thể sử dụng bất kỳ tệp thực thi nào trong cục bộ của mình /binbằng lệnh này:

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

Nếu bạn đang sử dụng scriptstrong pack.json thì:

...,
scripts: {
    'start': './setenv.sh <command>'
}

2
tập lệnh setenv này không cần thiết cho tập lệnh pack.json. npm đã chuẩn bị thư mục node_modules / .bin cục bộ thành đường dẫn cho bạn khi thực hiện npm chạy {scripts}.
jasonkarns 6/2/2015

0

Tôi muốn biết liệu đây có phải là một ý tưởng không an toàn / tồi tệ không, nhưng sau khi suy nghĩ về nó một chút, tôi không thấy một vấn đề nào ở đây:

Sửa đổi giải pháp không an toàn của Linus để thêm nó vào cuối, sử dụng npm binđể tìm thư mục và làm cho tập lệnh chỉ gọi npm binkhi package.jsoncó mặt trong cha mẹ (vì tốc độ), đây là những gì tôi nghĩ ra 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
}

Đối với bash, thay vì sử dụng precmdhook, bạn có thể sử dụng $PROMPT_COMMANDbiến (Tôi chưa kiểm tra điều này nhưng bạn có ý tưởng):

__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"

Thêm npm binvào cuối $PATHcó thể không thực thi những gì người dùng mong đợi: về cơ bản là một gói thực thi khác nhưng có lẽ là gói được cài đặt toàn cầu với phiên bản khác!
LoganMzz

0

Tôi là Windowsngười dùng và đây là những gì làm việc cho tôi:

// 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

Chúc may mắn.


0

Trong trường hợp bạn đang sử dụng fish shellvà không muốn thêm vào $pathvì lý do bảo mật. Chúng ta có thể thêm chức năng dưới đây để chạy các tệp thực thi nút cục bộ.

### 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

Bây giờ bạn có thể chạy những thứ như:

n coffee

hoặc nhiều đối số như:

n browser-sync --version

Lưu ý, nếu bạn là bashngười dùng, thì câu trả lời @ Bob9630 là cách để sử dụng bash's $@, không có sẵn trong đó fishshell.


-9

Bao gồm tập lệnh cà phê trong gói.json với phiên bản cụ thể được yêu cầu trong mỗi dự án, thường là như sau:

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

Sau đó chạy cài đặt npm để cài đặt phụ thuộc trong từng dự án. Điều này sẽ cài đặt phiên bản chỉ định của tập lệnh cà phê có thể truy cập cục bộ cho từng dự án.


Vâng, tôi đã nhận được như tôi đã nêu trong câu hỏi của tôi. Làm thế nào để tôi đặc biệt gọi một trong dự án của tôi bên cạnh ./node_modules/.bin/coffee?
typeoneerror

Nếu bạn đã chạy cài đặt npm với gói.json trong thư mục chính của dự án, bạn nên có thư mục ./node_modules/.bin/coffee trong thư mục này. Sử dụng ./node_modules/coffee-script/bin/coffee sẽ chạy phiên bản cà phê cục bộ trong khi chỉ chạy cà phê sẽ chạy cài đặt toàn cầu. Nếu bạn có một phiên bản cà phê khác được cài đặt trong một đường dẫn khác trong thư mục dự án này, bạn có thể truy cập nó bằng cách sử dụng ./path/to/this/installation/coffee.
almypal

Điều này đã không làm việc cho tôi. Tôi đang cố gắng sử dụng "svgo" và nó chỉ hoạt động khi được cài đặt trên toàn cầu. Tôi đã thử npm install svgocũng như npm installvới gói.json. Cả hai phương pháp đã cài đặt "thành công", nhưng lệnh "svgo" vẫn không khả dụng.
Ryan Wheale

1
Grunt sử dụng điều này một cách thông minh, và IMHO cũng vậy các gói khác. Đầu tiên bạn cài đặt grunt-cligói trên toàn cầu, sau đó trong thư mục dự án của bạn cài đặt bất kỳ phiên bản (đã sửa đổi) nào của gruntgói, sau đó khi bạn chạy grunt, nó sẽ sử dụng phiên bản cục bộ này.
ack
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.