pnpm run
별칭: run-script
패키지의 매니페스트 파일에 정의된 스크립트를 실행합니다.
예시#
다음과 같이 package.json에 watch 스크립트가 설정되어 있다고 가정해 봅시다:
"scripts": {
"watch": "webpack --watch"
}
이제 pnpm run watch를 사용하여 해당 스크립트를 실행할 수 있습니다! 간단하지요?
키 입력과 시간을 절약하고 싶은 분들을 위해 덧붙이자면, 모든 스크립트는 pnpm 명령의 별칭으로 등록되므로 결국 pnpm watch는 pnpm run watch의 축약형일 뿐입니다(이미 존재하는 pnpm 명령과 이름이 같지 않은 스크립트에 한해서만).
여러 스크립트 실행#
스크립트의 이름 대신 정규식을 사용하여 동시에 여러 스크립트를 실행할 수 있습니다.
pnpm run "/<regex>/"
watch:로 시작하는 모든 스크립트 실행:
pnpm run "/^watch:.*/"
상세 정보#
셸에 기존에 있는 PATH에 더해, pnpm run은 scripts에 제공되는 PATH에 node_modules/.bin을 포함합니다. 즉, 패키지가 설치되어 있는 한 일반 명령어처럼 스크립트에서 사용할 수 있습니다. 예를 들어, eslint가 설치되어 있다면 다음과 같이 스크립트를 작성할 수 있습니다:
"lint": "eslint src --fix"
그러면 eslint가 셸에 전역으로 설치되어 있지 않아도 실행됩니다.
워크스페이스의 경우 <workspace root>/node_modules/.bin도 PATH에 추가되므로, 워크스페이스 루트에 설치된 도구는 모든 워크스페이스 패키지의 scripts에서 호출할 수 있습니다.
환경#
실행되는 스크립트를 위해 pnpm이 자동으로 생성하는 환경 변수가 몇 가지 있습니다. 이러한 환경 변수를 사용하여 실행 중인 프로세스에 대한 컨텍스트 정보를 얻을 수 있습니다.
다음은 pnpm이 생성하는 환경 변수입니다:
- npm_command - 실행된 명령의 이름을 포함합니다. 실행된 명령이
pnpm run이면 이 변수의 값은 "run-script"가 됩니다.
옵션#
run 명령의 옵션은 모두 스크립트 이름 앞에 나열해야 합니다.
스크립트의 이름 뒤에 나열된 옵션은 실행된 스크립트에 전달됩니다.
다음은 모두 --silent 옵션으로 pnpm CLI를 실행합니다:
pnpm run --silent watch
pnpm --silent run watch
pnpm --silent watch
명령어 이름 뒤에 전달된 모든 인수는 실행된 스크립트에 추가됩니다.
따라서 watch가 webpack --watch를 실행한다면, 다음 명령은:
pnpm run watch --no-color
이렇게 실행됩니다.
webpack --watch --no-color
--recursive, -r#
이것은 각 패키지의 "scripts"에서 임의의 명령어를 실행합니다. 패키지에 명령어가 없으면 건너뜁니다. 명령이 있는 패키지가 하나도 없으면, 실패합니다.
--if-present#
스크립트가 정의되지 않았을 때 오류 종료 코드로 종료되지 않도록 하려면 --if-present 플래그를 사용할 수 있습니다. 이렇게 하면 실행 체인을 끊지 않고 정의되지 않았을 수 있는 스크립트를 실행할 수 있습니다.
--parallel#
동시성 및 토폴로지 정렬을 완전히 무시하고, prefixed streaming output이 있는 모든 일치하는 패키지에서 즉시 지정된 스크립트를 실행합니다. 긴 빌드 프로세스와 같은 많은 패키지에 대한 장기 실행 프로세스에서 선호되는 플래그입니다.
--stream#
원래 패키지 디렉터리를 접두사로 붙여 자식 프로세스의 출력을 즉시 스트리밍합니다. 이를 통해 서로 다른 패키지의 출력이 뒤섞여 출력될 수 있습니다.
--aggregate-output#
병렬로 실행되는 자식 프로세스의 출력을 집계하고 자식 프로세스가 완료될 때만 결과를 출력합니다. 이를 통해 pnpm -r <command>을 --parallel 또는 --workspace-concurrency=<number>과 함께 실행한 후 대량의 로그를 훨씬 쉽게 읽을 수 있습니다(특히 CI에서). 오직 --reporter=append-only만 지원됩니다.
--resume-from <package_name>#
특정 프로젝트부터 실행을 재개합니다. 대규모 워크스페이스에서 작업할 때, 빌드 순서상 앞에 있는 모든 프로젝트를 다시 실행하지 않고 특정 프로젝트부터 빌드를 다시 시작하려는 경우 유용합니다.
--report-summary#
스크립트 실행 결과를 pnpm-exec-summary.json 파일에 기록합니다.
pnpm-exec-summary.json 파일의 예시:
{
"executionStatus": {
"/Users/zoltan/src/pnpm/pnpm/cli/command": {
"status": "passed",
"duration": 1861.143042
},
"/Users/zoltan/src/pnpm/pnpm/cli/common-cli-options-help": {
"status": "passed",
"duration": 1865.914958
}
}
가능한 status 값은 다음과 같습니다: 'passed', 'queued', 'running'.
--reporter-hide-prefix#
병렬로 실행되는 자식 프로세스의 출력에서 워크스페이스 접두사를 숨기고, 원시 출력만 표시합니다. 이는 CI에서 실행 중이고 출력이 접두사 없이 특정 형식이어야 하는 경우에 유용할 수 있습니다(예: GitHub Actions annotations). 오직 --reporter=append-only만 지원됩니다.
--filter <package_selector>#
pnpm-workspace.yaml 설정#
enablePrePostScripts#
- 기본값: true
- 유형: Boolean
true이면 pnpm은 모든 pre/post 스크립트를 자동으로 실행합니다. 따라서 pnpm foo를 실행하는 것은 pnpm prefoo && pnpm foo && pnpm postfoo를 실행하는 것과 같습니다.
scriptShell#
- 기본값: null
- 유형: path
pnpm run 명령으로 실행하는 스크립트에 사용할 셸입니다.
예를 들어, Windows에서 Git Bash를 사용하도록 강제하려면:
pnpm config set scriptShell "C:\\Program Files\\git\\bin\\bash.exe"
shellEmulator#
- 기본값: false
- 유형: Boolean
값이 true이면 pnpm은 bash-like shell의 JavaScript 구현을 사용하여
스크립트를 실행합니다.
이 옵션은 플랫폼 간 스크립팅을 단순화합니다. 예를 들어, 기본적으로 다음 스크립트는 POSIX 규격이 아닌 시스템에서 실패합니다:
"scripts": {
"test": "NODE_ENV=test node test.js"
}
하지만 shellEmulator 설정을 true로 지정하면 모든
플랫폼에서 동작합니다.
참고
Node.js 22 이상에서는 pnpm의 도움 없이 스크립트를 실행할 수 있습니다. 위 예시의 경우 test 스크립트를 node --run test로 실행할 수 있습니다. 하지만 shellEmulator 옵션은 이 경우에 아무런 영향을 주지 않습니다. POSIX 기능에 의존하는 스크립트를 POSIX 규격이 아닌 환경에서 동작시키려면 pnpm run으로 실행해야 하며, node --run으로는 실행할 수 없습니다.