node_modules에 로컬로 설치된 패키지를 사용하는 방법은 무엇입니까?
나는에서 모듈의 로컬 버전을 어떻게 사용합니까 node.js
. 예를 들어 앱에서 커피 스크립트를 설치했습니다.
npm install coffee-script
이것은 그것을 설치 ./node_modules
하고 coffee 명령은에 ./node_modules/.bin/coffee
있습니다. 프로젝트의 기본 폴더에있을 때이 명령을 실행하는 방법이 있습니까? 번 bundle exec
들러 와 비슷한 것을 찾고 있다고 생각 합니다. 기본적으로 프로젝트와 관련된 모든 사람이 사용해야 할 커피 스크립트 버전을 지정하고 싶습니다.
-g
플래그를 추가하여 전 세계에 설치할 수 있으므로 커피가 어디서나 잘 작동하지만 프로젝트마다 다른 버전의 커피를 원한다면 어떻게해야합니까?
업데이트 : 정세 정은 아래 답변에서 지적했듯이 npm 5.2.0부터 사용할 수 있으므로 npx [command]
더 편리합니다.
5.2.0 이전 버전의 경우 오래된 답변 :
퍼팅 문제
./node_modules/.bin
PATH는 현재 작업 디렉토리가 프로젝트 디렉토리 구조의 루트 (즉, 위치 node_modules
) 인 경우에만 작동한다는 것입니다
작업 디렉토리가 무엇이든, 로컬로 설치된 바이너리 경로를 얻을 수 있습니다.
npm bin
coffee
프로젝트 디렉토리 계층 구조에 관계 없이 로컬로 설치된 바이너리 를 실행하려면 이 bash 구성을 사용할 수 있습니다
PATH=$(npm bin):$PATH coffee
나는 이것을 npm-exec에 별명을 붙였다.
alias npm-exec='PATH=$(npm bin):$PATH'
이제는 할 수 있습니다
npm-exec coffee
내가 어디에 있든 커피의 올바른 사본을 실행
$ 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
$PATH
더 이상 조작 할 필요가 없습니다 !
에서 npm@5.2.0 , NPM 과 함께 제공 npx
할 수 있습니다 패키지는 로컬에서 명령을 실행 node_modules/.bin
하거나 중앙 캐시를.
간단히 실행하십시오.
$ npx [options] <command>[@version] [command-arg]...
기본적으로, 또는 로컬 프로젝트 바이너리에 존재 npx
하는지 확인 하고 실행합니다.<command>
$PATH
호출 npx <command>
할 때 <command>
당신에없는 $PATH
자동으로 당신을 위해 NPM 레지스트리에서 해당 이름의 패키지를 설치하고 호출합니다. 설치가 완료되면 설치된 패키지가 전 세계 어디에도 없으므로 장기적으로 오염에 대해 걱정할 필요가 없습니다. --no-install
옵션 을 제공하여이 동작을 방지 할 수 있습니다 .
의 경우 다음 명령을 실행하여 패키지를 수동으로 npm < 5.2.0
설치할 수 있습니다 npx
.
$ npm install -g npx
npm bin
명령을 사용 하여 프로젝트의 노드 모듈 / bin 디렉토리를 가져 오십시오.
$ $(npm bin)/<binary-name> [args]
예 :
$ $(npm bin)/bower install
사용하다 npm run[-script] <script name>
해당 지역에 빈 패키지를 설치 NPM을 사용하면 ./node_modules
디렉토리 수정, package.json
추가 할 <script name>
다음과 같이 :
$ npm install --save learnyounode
$ edit packages.json
>>> in packages.json
...
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"learnyounode": "learnyounode"
},
...
$ npm run learnyounode
npm install에 --add-script 옵션이나 다른 것이 있거나 scripts 블록에 추가하지 않고 npm run이 작동하면 좋을 것입니다.
사용하십시오 npm-run
.
읽어보기에서 :
npm-run
node_modules에서 로컬 실행 파일 찾기 및 실행
npm 수명주기 스크립트에 사용 가능한 모든 실행 파일을 사용할 수 있습니다 npm-run
.
용법
$ npm install mocha # mocha installed in ./node_modules
$ npm-run mocha test/* # uses locally installed mocha executable
설치
$ npm install -g npm-run
업데이트 : 언급 된 보안상의 이유로 최신 npm bin
명령이 아닌이 방법을 더 이상 권장하지 않습니다 . 아래의 원래 답변 :
알다시피, 로컬로 설치된 바이너리는에 ./node_modules/.bin
있습니다. 전역 적으로 사용 가능한 이진 파일이 아닌이 디렉토리에서 이진 파일을 항상 실행하려면 ./node_modules/.bin
먼저 경로를 먼저 입력하는 것이 좋습니다 .
export PATH="./node_modules/.bin:$PATH"
이것을 당신의에 넣으면 ~/.profile
, coffee
항상 가능 ./node_modules/.bin/coffee
하다면 그렇지 않으면 /usr/local/bin/coffee
(또는 노드 모듈을 설치하는 접두사)
PATH 솔루션에 $ (npm bin)이 .profile / .bashrc / etc에 배치되면 한 번 평가되고 경로가 처음 평가 된 디렉토리로 영원히 설정됩니다. 대신 현재 경로를 수정하면 스크립트를 실행할 때마다 경로가 커집니다.
이러한 문제를 해결하기 위해 함수를 작성하여 사용했습니다. 환경을 수정하지 않으며 사용하기 쉽습니다.
function npm-exec {
$(npm bin)/$@
}
그러면 환경을 변경하지 않고도 다음과 같이 사용할 수 있습니다.
npm-exec r.js <args>
npm을 유지하려면 npx 가 필요한 것을 수행해야합니다.
면사로 전환 (페이스 북으로 npm 교체)이 옵션 인 경우 다음으로 전화 할 수 있습니다.
yarn yourCmd
package.json 내부의 스크립트가 우선권을 가지며, 없으면 스크립트 내부를 찾습니다 ./node_modules/.bin/
.
또한 실행 한 결과를 출력합니다.
$ yarn tsc
yarn tsc v0.27.5
$ "/home/philipp/rate-pipeline/node_modules/.bin/tsc"
따라서의 각 명령에 대해 스크립트를 설정할 필요가 없습니다 package.json
.
.scripts
내부에 스크립트가 정의되어있는 경우 package.json
:
"tsc": "tsc" // each command defined in the scripts will be executed from `./node_modules/.bin/` first
yarn tsc
yarn run tsc
또는 npm run tsc
다음 과 같습니다 .
yarn tsc
yarn tsc v0.27.5
$ tsc
쉘 별명이나 다른 패키지에 의존하지 않는 것을 선호합니다.
의 scripts
섹션에 간단한 줄을 추가하면 다음 package.json
과 같은 로컬 npm 명령을 실행할 수 있습니다
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"
}
}
업데이트 : 최근 npm을 사용하는 경우 (버전> 5.2)
당신이 사용할 수있는:
npx <command>
npx
.bin
당신의 경우 디렉토리 에서 명령을 찾습니다node_modules
오래된 대답 :
Windows의 경우
다음 파일을 파일에 저장하고 파일에 npm-exec.bat
추가하십시오.%PATH%
@echo off
set cmd="npm bin"
FOR /F "tokens=*" %%i IN (' %cmd% ') DO SET modules=%%i
"%modules%"\%*
용법
그런 다음처럼 사용할 수 있습니다 npm-exec <command> <arg0> <arg1> ...
예를 들어
wdio
로컬 node_modules 디렉토리에 설치된를 실행하려면 다음을 수행하십시오 .
npm-exec wdio wdio.conf.js
즉, 실행됩니다 .\node_modules\.bin\wdio wdio.conf.js
현재 작업 디렉토리를 기반으로 PATH 변수를 올바르게 업데이트하려면이를 .bashrc
동등한 끝에 추가하십시오 (또는 정의하는 항목 뒤에 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
이것은 bash 프롬프트가 렌더링 될 때마다 (프로젝트의 크기에 따라) 약간의 지연을 일으킬 수 있으므로 기본적으로 비활성화되어 있습니다.
node-mode
및 node-mode-off
을 각각 실행하여 터미널 내에서 활성화 및 비활성화 할 수 있습니다 .
나는 항상 package.json 파일에 스크립트를 생성하고 npm run script-name을 실행하는이 문제를 해결하기 위해 @guneysus와 동일한 접근 방식을 사용했습니다.
그러나 최근 몇 개월 동안 나는 npx를 사용 하고 있으며 그것을 좋아합니다.
예를 들어 Angular 프로젝트를 다운로드했는데 Angular CLI를 전체적으로 설치하고 싶지 않았습니다. 따라서 npx가 설치된 상태에서 전역 각도 cli 명령을 사용하는 대신 (설치 한 경우) 다음과 같이하십시오.
ng serve
콘솔 에서이 작업을 수행 할 수 있습니다.
npx ng serve
여기 NPX에 대해 쓴 기사가 있는데 여기에 더 깊이 들어가 있습니다.
zxc 는 nodejs의 "번들 exec"와 같습니다. 다음을 사용하는 것과 비슷합니다 PATH=$(npm bin):$PATH
.
$ npm install -g zxc
$ npm install gulp
$ zxc which gulp
/home/nathan/code/project1/node_modules/.bin/gulp
@regular와 동일하지만 생선 껍질 맛
if not contains (npm bin) $PATH
set PATH (npm bin) $PATH
end
저도 같은 문제가 발생하여 나는 특히 별칭을 사용하는 것과하지 않는 (로 일반 '제안들), 그리고 당신이 그들처럼하지 않으면 너무 여기에 내가 사용, 먼저 작은 실행 bash는 스크립트를 작성해야한다는 또 다른 해결 방법입니다 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 "$@"
그런 다음 /bin
이 명령을 사용 하여 로컬에서 실행 파일을 사용할 수 있습니다 .
./setenv.sh <command>
./setenv.sh 6to5-node server.js
./setenv.sh grunt
scripts
package.json에서 사용하는 경우 :
...,
scripts: {
'start': './setenv.sh <command>'
}
이것이 안전하지 않은 / 나쁜 아이디어인지 알고 싶지만 조금 생각한 후에는 여기에서 문제가 발생하지 않습니다.
Linus의 안전하지 않은 솔루션을 수정 npm bin
하여 디렉토리 를 추가 하고 디렉토리를 찾는 데 사용 하고 부모가 (속도를 위해) 존재 npm bin
하는 경우 에만 스크립트를 호출 하면 다음 package.json
과 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
}
의 경우 후크 bash
를 사용하는 대신 변수를 precmd
사용할 수 있습니다 $PROMPT_COMMAND
(테스트하지는 않았지만 아이디어는 얻었습니다).
__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"
direnv를 사용하고 작업 폴더에서만 $ PATH 변수를 변경할 수도 있습니다.
$ cat .envrc
> export PATH=$(npm bin):$PATH
에이 스크립트를 추가하십시오 .bashrc
. 그런 다음 전화를 걸 coffee
거나 로컬로 연결할 수 있습니다. 랩톱에는 편리하지만 서버에서는 사용하지 마십시오.
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;
참고 :이 스크립트는 cd
명령의 별칭을 만들고 호출 할 cd
때 마다 이를 확인 node_modules/.bin
하고에 추가합니다 $PATH
.
참고 2 : 세 번째 줄을로 변경할 수 있습니다 NODE_MODULES=$(npm bin);
. 그러나 cd
명령이 너무 느려질 것입니다.
나는 Windows
사용자이며 이것이 나를 위해 일한 것입니다.
// 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
행운을 빕니다.
Windows의 경우 다음을 사용하십시오.
/* cmd into "node_modules" folder */
"%CD%\.bin\grunt" --version
보안상의 이유로 사용 fish shell
하고 있고 추가하고 싶지 않은 경우 $path
. 로컬 노드 실행 파일을 실행하기 위해 아래 기능을 추가 할 수 있습니다.
### 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
이제 다음과 같은 것을 실행할 수 있습니다.
n coffee
또는 다음과 같은 인수가 더 있습니다 :
n browser-sync --version
참고로 bash
사용자 인 경우 @ Bob9630 답변은 bash의를 활용하여 갈 $@
수있는 방법 fishshell
입니다.
각 프로젝트에 필요한 특정 버전과 함께 package.json에 커피 스크립트를 포함하십시오 (일반적으로 다음과 같이).
"dependencies":{
"coffee-script": ">= 1.2.0"
그런 다음 npm install을 실행하여 각 프로젝트에 종속성을 설치하십시오. 그러면 각 프로젝트에서 로컬로 액세스 할 수있는 지정된 버전의 커피 스크립트가 설치됩니다.
참고 URL : https://stackoverflow.com/questions/9679932/how-to-use-package-installed-locally-in-node-modules
'Programing' 카테고리의 다른 글
Twitter Bootstrap 버튼을 올바르게 정렬하려면 어떻게해야합니까? (0) | 2020.02.18 |
---|---|
EditText에서 언더 바를 숨기는 방법 (0) | 2020.02.18 |
상대 레이아웃의 백분율 너비 (0) | 2020.02.18 |
배열을 어떻게 섞을 수 있습니까? (0) | 2020.02.18 |
MS SQL Server와 작동하는 Mac OS X 용 SQL 클라이언트 (0) | 2020.02.18 |