2016-06-02 8 views
2

노드 js에 익숙하지 않습니다. npm 모듈을 빌드하고 패키지 파일 이름과 함께 /node_modules/.bin 폴더에있는 cmd 파일과 약간 혼란 스럽습니다.노드 js의 node_modules/.bin/package.cmd 파일

종속성으로 여러 패키지를 설치했고 cmd 파일이 다르다는 것을 알았습니다.

는 jade.cmd

@IF EXIST "%~dp0\node.exe" (
    "%~dp0\node.exe" "%~dp0\..\jade\bin\jade" %* 
) ELSE (
    @SETLOCAL 
    @SET PATHEXT=%PATHEXT:;.JS;=;% 
    node "%~dp0\..\jade\bin\jade" %* 
) 

모카 casperjs.cmd

@IF EXIST "%~dp0\/bin/sh.exe" (
    "%~dp0\/bin/sh.exe" "%~dp0\..\mocha-casperjs\bin\mocha-casperjs" %* 
) ELSE (
    @SETLOCAL 
    @SET PATHEXT=%PATHEXT:;.JS;=;% 
    /bin/sh "%~dp0\..\mocha-casperjs\bin\mocha-casperjs" %* 
) 

내 질문입니다, 그것은 NPM은 2 개 가지 패키지는 2 개 가지 파일을 생성하는 이유 NPM에 의해-자동으로 생성되는 경우. Is는 사용자가 NPM을 만들고 알려주는 것입니까?

답변

1

패키지와 함께 제공된 실행 파일을 ./node_modules/.bin 디렉토리 (로컬 설치의 경우) 또는 전역 (전역으로 모듈을 설치 한 경우)에서 액세스 할 수 있도록 npm에 알릴 수 있습니다. 에 bin 필드를두고 스크립트의 상대 경로를 지정해야합니다. 예를 들어, 옥 package.json 다음 코드가 포함

"bin": { 
    "jade": "./bin/jade.js" 
} 

옥 패키지를 설치, NPM이 발생하여이 스크립트 (./bin/jade.js) 접근 할 수 있습니다를,이 켜지지 경우, 내용이 현재의 OS, 쉘에 의존하는 래퍼 스크립트 (jade.cmd) 당신이 접근하고자하는 스크립트의 유형. Jade는 .js 스크립트를 사용하고 npm은 노드를 실행하고 스크립트 이름을 인수로 전달할 OS에 대해 jade.cmd을 생성합니다. 하지만 mocha-casperjs는 쉘 스크립트를 사용하므로 생성 된 mocha-casperjs.cmd의 내용이 다릅니다. 노드 대신 sh.exe이 시작됩니다.

당신은 여기에 대한 bin 필드 package.json의를 읽을 수 있습니다 : https://docs.npmjs.com/files/package.json#bin

+0

bin in package.json은 패키지 실행 파일이있는 위치를 알려줍니다. 그러나 패키지를 설치할 때 npm을 node_modules/jade에 설치하고 (jade는 예제 일뿐) node_modules/jade/bin/jade를 가리키는 node_modules/.bin/jade.cmd에 cmd 파일을 추가하십시오. – prabhat

+0

@prabhat, 네, 맞습니다. 나는 node_modules/.bin 디렉토리에 cmd 파일 npm 장소를 생성하는 것에 대해 썼다. 이 cmd 파일의 내용을 수동으로 변경할 수 없으며 자동 생성됩니다. 그것은 당신의 질문에 대답합니까, 아니면 당신을 이해하지 못했습니까? – Victor

+0

npm에서 생성하는 경우, 왜 2 패키지가 다른지, 제 질문입니다. 나는 그것에 대해 Google에 아무것도 찾을 수 없습니다 그래서 여기에 물었다. – prabhat

1

TL을, 박사 Windows에서

, npm 래퍼 배치 파일을 만듭니다 (*.cmd)은 어떤 쉘/인터프리터에 지정되어 기반으로 스크립트 파일 주저 라인.


당신이보고있는 것은shebang 메커니즘 용 Windows 실행 일반 텍스트 파일 (스크립트)의 바로 1 라인, 그것은로 시작하면의 유닉스의 NPM의 에뮬레이션 매직 문자 #!은 실행을 위해 스크립트를 전달할 인터프리터/쉘을 알려줍니다 (자세한 내용은 내 this answer 참조). Windows가 당면한 라인을 지원하지 않기 때문에

npm는 명시 적으로 지정되어 어떤 실행 파일과 함께 "이진"파일 (package.jsonbin 키에 지정된 스크립트 파일을)를 호출하는 래퍼*.cmd (배치) 파일을 만듭니다 스크립트 파일의 속어 줄에.

다른 말로 : npm은 호출 할 쉘/인터프리터를 판별하기 위해 스크립트의 shebang 행을 분석하고 이에 따라 래퍼 배치 스크립트를 작성합니다. 우리가 jade 패키지 내부 ./bin/jade.js 훔쳐 경우

, 우리는 jade.cmd 래퍼 파일이 node.exe를 호출하는 이유입니다 오두막 라인으로 #!/usr/bin/env node 참조하십시오.
이것은 일반적인 경우 경우 : Node.js를 엔진
에 의해 실행 해야하는 자바 스크립트로 작성된 스크립트.

그러나, 다른 쉘/통역 너무을 지정하지만, 주어진 쉘/통역도 윈도우볼 수 있습니다 그래서 만약 에만 의미가 있습니다 일을 할 수있다; node을 위해, 그 mocha-casper.cmd 쇼의 내용으로, 그것은 유닉스 기본 쉘, /bin/sh (패키지 mocha-casper.js에서 ./bin/mocha-casperjs 파일에 포함 된 오두막 라인 #!/bin/sh)와 말도 안돼, 주어진이지만. npm이 인식하지 못하기 때문에, 그러나이 배치 파일을 - mocha-casperjs

제작자는 mocha-casperjs.batcmd.exe의 유닉스 쉘 스크립트 (또는 배치 파일)을 다시 구현하여 자신의 윈도우 통합을 출시하기로 선택한 프로젝트 컨텍스트에서 CLI를 호출 할 때 PATH (글로벌)/이름 만 검색 할 수 없습니다. 대상 쉘/통역이 에 의해 지정된 경우 제외 - 그것은 절대, POSIX 스타일 경로와 오두막 라인을 사용하는 것이 이해가되지 않습니다 더 일반적으로

, 또한 Windows에서 작동하는 스크립트에 대한 , /usr/bin/env을 통해 간접적 인 호출은 npm으로 신호를 보내고, 이는 PATH에서 찾아야합니다 (자세한 내용은 다시 this answer 참조).
(또한 래퍼 배치 파일은 자신의 디렉토리에서 실행 파일을 찾습니다. 그러나 npm은 명시 적으로 해당 파일을 package.json의 항목으로 추가하더라도 거기에 복사하지 않으므로 거의 도움이되지 않습니다. bin 키) 여담으로

:. npm의 최신 버전은 또한 유닉스 환경, Windows에서 우분투 특히 Cygwin에서, 그리고 배쉬에 대한 확장없는 래퍼 스크립트를 작성합니다.


경기 선행 지수에 대한 자신의 패키지 ("바이너리") 작성 - 명령 줄 유틸리티 같은 역할을 직접 실행 스크립트 - 윈도우 너무작업에 NPM 패키지의 일부입니다, 당신

  • 는 스크립트에 당면한 라인을 추가 - 당신은 오직 Windows에서이를 실행하려는 경우에도 :해야합니다.

  • 세번 라인을 #!/usr/bin/env <interpreter-executable-filename-without-extension>으로 정의하십시오. 스크립트는 자바 스크립트로 작성하고 node으로 실행해야하는 경우 - - 일반적으로 사용 : 당신의 package.json 파일의 bin 키에서
    #!/usr/bin/env node

  • , 스크립트의 키 확장없이 정의합니다.은 래퍼 배치 파일을 만들 때 .cmd이 키 이름에 직접 추가되기 때문에 (Unix에서는 그대로 키의 이름이 지정된 심볼릭 링크가 생성됩니다); 예 : "bin": { "foo": "./bin/fooj.js" }

  • 주의 할 : 스크립트가 가리키는 경우 package.jsonbin 키를 확장 .js을 가지고 있지만 오두막 라인을 이 없다가, 래퍼 스크립트가있는 것이라고 .js 파일 직접를 호출합니다 기본값은 Node.js 대신 WSH (구체적으로는 JScript의 JavaScript 엔진)으로 실행합니다. 이는 의도 한대로 작동하지 않습니다. 표시되는 증상은 this question입니다.