on
Node.js의 package.json의 scripts 필드를 자세히 알아보자
Node.js의 package.json의 scripts 필드를 자세히 알아보자
현재 진행 중인 프로젝트에서 package.json의 scripts 필드를 다룰 일이 생겨서 이 글을 작성해 보았습니다. 이 글은 npm 공식문서를 번역한 글입니다. 오역, 의역이 많습니다.
설명
npm은 다음의 scripts를 package.json 파일의 “scripts” 속성에서 지원합니다.
prepublish : 패키지가 압축되어 배포되기 전에 실행합니다(뿐만 아니라 인자 없이 npm install 을 실행할 때에도 적용됩니다).
: 패키지가 압축되어 배포되기 전에 실행합니다(뿐만 아니라 인자 없이 npm install 을 실행할 때에도 적용됩니다). prepare : 인자 없이 npm install 할 때와 git dependencies 를 설치할 때, 이 둘을 패키지가 압축되어 배포되기 전에 실행합니다. 이 명령은 republish 다음 prepublishOnly 전에 실행됩니다.
: 인자 없이 npm install 할 때와 git dependencies 를 설치할 때, 이 둘을 패키지가 압축되어 배포되기 전에 실행합니다. 이 명령은 republish 다음 prepublishOnly 전에 실행됩니다. prepublishOnly : 패키지가 압축되어 배포되기 전에 실행하지만, npm publish 일 때만 실행합니다.
: 패키지가 압축되어 배포되기 전에 실행하지만, npm publish 일 때만 실행합니다. prepack : tarball(tar 압축 파일)이 압축되기 전에 실행합니다(npm pack, npm publish, 그리고 git dependencies 설치시에 적용됩니다).
: tarball(tar 압축 파일)이 압축되기 전에 실행합니다(npm pack, npm publish, 그리고 git dependencies 설치시에 적용됩니다). postpack : tarball(tar 압축 파일)이 생성된 후 최종 목적지로 이동한 후에 실행합니다.
: tarball(tar 압축 파일)이 생성된 후 최종 목적지로 이동한 후에 실행합니다. publish, postpublish : 패키지가 배포된 후 실행합니다.
: 패키지가 배포된 후 실행합니다. preinstall : 패키지를 설치하기 전에 실행합니다.
: 패키지를 설치하기 전에 실행합니다. install, postinstall : 패키지를 설치한 후에 실행합니다.
: 패키지를 설치한 후에 실행합니다. preuninstall, uninstall : 패키지를 삭제하기 전에 실행합니다.
: 패키지를 삭제하기 전에 실행합니다. postuninstall : 패키지를 삭제한 후에 실행합니다.
: 패키지를 삭제한 후에 실행합니다. preversion : 패키지 버전을 충돌시키기 전에 실행합니다.
: 패키지 버전을 충돌시키기 전에 실행합니다. version : 패키지 버전이 충돌된 후, commit 전에 실행합니다.
: 패키지 버전이 충돌된 후, commit 전에 실행합니다. postversion : 패키지 버전이 충돌된 후, 그리고 commit 후에 실행합니다.
: 패키지 버전이 충돌된 후, 그리고 commit 후에 실행합니다. pretest, test, posttest : npm test 명령어로 실행합니다.
: npm test 명령어로 실행합니다. prestop, stop, poststop : npm stop 명령어로 실행합니다.
: npm stop 명령어로 실행합니다. prestart, start, poststart : npm start 명령어로 실행합니다.
: npm start 명령어로 실행합니다. prerestart, restart, postrestart : npm restart 명령어로 실행합니다(주의: 만약 restart 스크립트가 제공되지 않은 경우 npm restart 는 stop 과 start 스크립트를 실행합니다).
: npm restart 명령어로 실행합니다(주의: 만약 restart 스크립트가 제공되지 않은 경우 npm restart 는 stop 과 start 스크립트를 실행합니다). preshrinkwrap, shrinkwrap, postshrinkwrap: npm shrinkwrap 명령어로 실행합니다.
추가적으로, 임의의 스크립트는 npm run-script 를 사용하여 실행할 수 있습니다. 명령어 이름에 pre 와 post가 있는 것 또한 마찬가지입니다(예시: premyscript, myscript, postmyscript).
dependencies의 스크립트는 npm explore — npm run 를 사용하여 실행할 수 있습니다.
기본 값
npm은 패키지 내용에 따라 일부 스크립트 기본 값을 설정합니다.
“start”: “node server.js”
만약 server.js 파일이 패키지의 root(최상위)에 있다면, npm은 start 명령어의 기본값으로 node server.js 를 설정합니다.
“install”: “node-gyp rebuild”
만약 binding.gryp 파일이 페키지 root에 있고 임의의 install 또는 preinstall 스크립트를 정의하지 않았다면, npm은 node-gyp를 사용하여 컴파일하도록 install 명령어의 기본 값을 설정합니다.
사용자
만약 npm을 root 권한으로 호출하면, 사용자 계정의 uid 또는 user 설정에 지정된 uid로 변경됩니다. 기본 값은 nobody 입니다. root 권한으로 스크립트를 실행할 땐 unsafe-perm 플래그를 설정하세요.
환경
npm의 설정과 현재 프로세스의 상태와 관련하여 많은 정보들로 이루어진 환경 속에서 패키지 스크립트는 실행됩니다.
경로
만약 테스트 코드 묶음 처럼 실행 스크립트를 정의하는 모듈에 의존하는 경우 해당 실행 파일들이 스크립트 실행을 위해 PATH에 추가됩니다. 만약 package.json 에 아래와 같이 되어 있다면:
{ “name” : “foo”, “dependencies” : { “bar” : “0.1.x” }, “scripts”: { “start” : “bar ./test” } }
npm install로 설치된 node_modules/.bin 디렉토리에서 내보내진 bar 스크립트를 실행하기 위해 npm start를 실행할 수 있습니다.
package.json vars
package.json 필드들은 npm_package_ 접두사로 고정됩니다.
예를 들어, 만약 package.json 파일에
{“name”:”foo”, “version”:”1.2.5"}
이 정의가 있다면 당신의 패키지 스크립트는 npm_package_name 환경 변수에 “foo”를 설정할 것이고, npm_package_version 에는 “1.2.5” 를 설정할 것입니다.
이제 코드 내에서 process.env.npm_package_name 과 process.env.npm_package_version 으로 접근할 수 있고, 다른 필드에서도 마찬가지입니다.
설정
설정 매개변수들은 npm_config_ 접두사가 있는 환경에 설정됩니다. 예를 들어, npm_config_root 환경 변수를 확인하여 유요한 root 설정을 볼 수 있습니다.
특수한: package.json “config” 객체
[@version>]: 의 설정 매개 변수가 있으면 환경에서 package.json의 “config” 키를 덮어 씁니다.
예를 들어, 만약 package.json이 아래와 같이 있고:
{ “name” : “foo”, “config” : { “port” : “8080” }, “scripts” : { “start” : “node server.js” } }
server.js 가 아래와 같다면:
http.createServer(…).listen(process.env.npm_package_config_port)
사용자가 다음을 수행하여 동작을 변경할 수 있습니다:
npm config set foo:port 80
현재 라이프사이클 이벤트
마지막으로 npm_lifecycle_event 환경 변수는 실행 중인 주기의 단계가 어느 단계인지 설정합니다.
그래서, 현재 진행 중인 상황에 따라 전환되는 프로세스의 다른 부분의 단일 스크립트를 사용할 수 있습니다.
객체는 다음의 형식에 따라 병합되므로, package.json에
{ “scripts”: { “install”: “foo.js” } }
가 있으면, 스크립트에 다음과 같이 확인할 수 있습니다.
process.env.npm_package_scripts_install === “foo.js”
예를 들어, package.json에 다음과 같이 있다면:
{ “scripts” : { “install” : “scripts/install.js”, “postinstall” : “scripts/install.js”, “uninstall” : “scripts/uninstall.js” } }
scripts/install.js 는 라이프사이클의 install 과 post-install 단계를 위해 호출될 것이고, scripts/uninstall.js 는 패키지가 삭제될 때 호출될 것입니다.
scripts/install.js 는 다른 두 단계로 실행되므로, 이 상황에선 npm_lifecycle_event 환경 변수를 보는 것이 현명합니다.
만약 make 명령을 실행하고 싶다면 할 수 있습니다:
{ “scripts” : { “preinstall” : “./configure”, “install” : “make && make install”, “test” : “make test” } }
정리
스크립트는 스크립트 인수로 라인(줄)을 sh 에 전달하여 실행합니다. 만약 스크립트가 0 이외의 코드로 종료되면, 프로세스가 중단될 것입니다.
이 스크립트 파일들은 nodejs 또는 javascript 프로그램일 필요가 없습니다. 단지 일종의 실행 파일이어야만 합니다.
HOOK 스크립트
만약 모든 패키지들에 특정 라이프사이클 이벤트일 때 특정 스크립트를 실행하고 싶다면, hook 스크립트를 사용할 수 있습니다.
실행가능한 파일을 node_modules/.hooks/{eventname} 위치에 두면 해당 시점을 통과할 때 root에 설치된 모든 패키지에 대한 패키지 라이프 사이클이 실행될 것입니다.
Hook 스크립트는 package.json 스크립트와 완전히 같은 방법으로 실행됩니다. 즉, 위에서 설명한 env와 함께 별도의 하위 프로세스에 있습니다.
모범 예시
정말로 의도한 것이 아니면 0이 아닌 에러 코드로 종료하지 마십시오. 이것은 삭제 스크립트를 제외한 npm 작업이 실패하고, 잠재적으로 롤 백 되는 원인이 될 것입니다. 만약 실패가 경미하거나 선택적 기능만 막는다면, 경고를 출력하거나 성공적으로 종료하는 것이 나을 것입니다.
스크립트를 사용하여 npm이 할 수 있는 작업을 하지 마세요. package.json 을 읽고 당신의 패키지를 적절하고 간결하게 설명하여 지정하고 활성화 할 수 있는 모든 명령어들을 확인하세요. 일반적으로 이것은 보다 강력하고 일관된 상태로 이끌 것입니다.
환경을 점검하여 넣을 위치를 결정하세요. 예를 들어, 만약 npm_config_binroot 환경 변수에 /home/user/bin 이 설정되어 있다면 /usr/local/bin 위치에 실행가능한 파일을 설치하지 마십시오. 사용자는 아마도 이유가 있어서 그렇게 설정했을 것입니다.
스크립트 명령어의 접두사로 “sudo”를 쓰지 마세요. 만약 어떤 이유로 root 권한이 필요하다면, 에러와 함께 실패할 것이고 사용자는 문제의 npm 명령어를 sudo 로 실행할 것입니다.
install 을 사용하지 마세요. 컴파일에는 .gyp 파일을 사용하고 다른 것들은 prepublish 를 사용하세요. preinstall 이나 install 스크립트를 명시적으로 설정하지 않아도 됩니다. 만약 그렇게 하고 싶다면, 다른 옵션은 없는지 고려해 보세요. install 또는 preinstall 스크립트의 사용이 허락되는 경우는 오직 대상 아키텍처에서 수행하는 컴파일용 뿐입니다.
from http://clap-yeon.tistory.com/64 by ccl(A) rewrite - 2021-11-29 15:01:09