Programing

node_modules에 로컬로 설치된 패키지를 사용하는 방법은 무엇입니까?

lottogame 2020. 2. 18. 22:37
반응형

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 tscyarn 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-modenode-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

scriptspackage.json에서 사용하는 경우 :

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

이것이 안전하지 않은 / 나쁜 아이디어인지 알고 싶지만 조금 생각한 후에는 여기에서 문제가 발생하지 않습니다.

Linus의 안전하지 않은 솔루션을 수정 npm bin하여 디렉토리 를 추가 하고 디렉토리를 찾는 데 사용 하고 부모가 (속도를 위해) 존재 npm bin하는 경우 에만 스크립트를 호출 하면 다음 package.jsonzsh같습니다.

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

반응형