2017-05-11 3 views
0

내 프로젝트의 경우 일부 프로젝트 관련 도구가 포함 된 github에서 git를 만들었습니다. 자식은 package.jsonbin 지시어에 매핑 된 일부 바이너리를 포함합니다. 실제 NPM의 REPO 서버에 게시 개인의 repo가 ​​아닌하면서, 그것은전역으로 설치된 경우 스크립트에서 npm repo에 대한 경로를 얻는 방법

$ npm install -g git+ssh://[email protected]:<path to my tool git> 

이 도구의 대부분은 모듈에서 다른 파일에 대한 종속성이없는 사용하여 설치, 그들은 잘 작동 할 수있다 . 그러나 도구 중 하나는 local DynamoDB server을 시작하는 래퍼입니다, 내 package.json이 같은 섹션이 포함되어

#/bin/bash 
java -Djava.library.path=DynamoDB/DynamoDBLocal_lib -jar DynamoDB/DynamoDBLocal.jar -inMemory 

DynamoDB 폴더 :

"bin": { 
    "ddb-local": "db/ddb_local.sh" 
} 

db/db_local.sh 파일이 시작 DynamoDB의 java 명령을 포함을 내 모듈의 루트에있는

<module root> 
| 
|- db 
    |- DynamoDB 
     |- DynamoDBLocal.jar 
     |- DynamoDBLocal_lib 
    | ddb_local.sh 
|- package.json 

db 폴더에 있습니다. ddb-local은 내 노드 bin 폴더에서 연결되어 어디서나 호출 할 수 있지만 <path to my module>/db 폴더가 내 현재 디렉토리가 아니면 ddb_local.sh 스크립트가 실패합니다. 이는 스크립트와 관련된 파일을 찾으려고하기 때문에 스크립트는 실패합니다. 내 경우에는 NVM을 사용하여 다음과 같이 실행하십시오. ~/.nvm/versions/node/v4.6.1/bin/

이제는 노드 스크립트라면 require 내 모듈의 파일을 쉽게 만들 수 있지만 bash 스크립트는 무엇인지 잘 모릅니다. 가장 좋은 방법은 내 모듈 디렉토리에있는 파일에 대한 유효한 경로를 생성하는 것입니다.

나는 나의 패키지 ~/.nvm/versions/node/v4.6.1/lib/node_modules/<my module> 아래에 설치되어 있는지 알고 내가

`dirname "$0"`/../lib/node_modules/<module name> 

같은 것을 사용하여 내 모듈의 파일에 대한 상대 경로를 만들 수 있지만이 정말 이해하지 않는 것 같습니다. 바이너리로 전 세계적으로 설치되는 스크립트에서 모듈의 다른 스크립트 나 파일을 쉽게 참조 할 수있는 방법이 있습니까? 모든 환경 변수 등을 인쇄하여 모듈의 경로가 포함 된 무언가를 찾고 있지만 운이 없다.

+0

귀하의 경우 모듈의 루트 폴더 인'my_module'을 이동하고'npm link'를 실행 한 다음 참조/가져 오기를 원하는 위치로 돌아가서'npm link my_module'을 실행하십시오. 희망이 도움이! –

+0

npm 링크가 도움이 될 수 있지만,이 모듈의 목적은 조직의 다른 사용자가 npm을 -n 설치할 수 있어야하고 추가 마법에 의지하지 않고도 도구를 사용할 수 있어야한다는 것입니다. 코드는 이제 작동하지만 모듈 이름에 종속되어 있으며 추악합니다. 나는 $ 0을 사용하고 npm이 $ NODE/bin에서 생성하는 심볼릭 링크를 해결하려고 시도했다./ lib/node_modules/ 그것은 적어도 내 스크립트의 실제 경로를 제공 할 것이지만 행운은 없습니다. – JHH

답변

0

나는 dirnamereadlink의 조합을 사용하여 약간 더 나은 솔루션을 마련했습니다

SCRIPT_PATH=$(dirname $(dirname $0)/$(readlink $0)) 

이 전 세계적으로 설치 NPM 모듈은 $NODE_PATH/bin/<script>에서 ../lib/node_modules/<npm-module>/<script>에 심볼릭 링크로 설치되어 있다는 사실을 사용합니다.

모든 환경에서 100 % 강력한 것은 아니며 더 쉬운 방법이 있어야한다고 생각되지만 작동합니다.