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:.*/"

선택자는 정규식 리터럴 — 즉, 슬래시로 감싼 형태 — 로 작성해야 하며, 셸이 이를 변형하지 않도록 따옴표로 묶어야 합니다. 일반 문자열은 항상 리터럴 스크립트 이름으로 취급되며, 인수와 이름이 정확히 일치하는 스크립트가 정규식 매칭보다 우선합니다.

매칭은 고정되지 않으므로 "/build:.*/"는 prebuild:web에도 일치합니다. 정확한 접두사가 필요한 경우 ^와 $로 패턴을 고정하세요.

매칭된 스크립트는 사전순으로 실행되므로, package.json에 스크립트가 나타나는 순서와 관계없이 선택이 결정적입니다. 엄격하게 한 번에 하나씩 실행하려면 --sequential을 추가하세요.

정규식 플래그는 지원되지 않습니다: pnpm run "/^build:.*/i"는 ERR_PNPM_UNSUPPORTED_SCRIPT_COMMAND_FORMAT 오류로 실패합니다.

상세 정보#

셸의 기존 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 플래그를 사용할 수 있습니다. 이렇게 하면 실행 체인을 끊지 않고 잠재적으로 정의되지 않은 스크립트를 실행할 수 있습니다.

--no-bail#

일치하는 스크립트 중 하나가 실패하더라도 나머지 스크립트를 계속 실행합니다. 실패한 스크립트가 하나라도 있으면 명령은 여전히 영이 아닌 종료 코드로 종료됩니다.

--parallel#

동시성 및 토폴로지 정렬을 완전히 무시하고, prefixed streaming output이 있는 모든 일치하는 패키지에서 즉시 지정된 스크립트를 실행합니다. 긴 빌드 프로세스와 같은 많은 패키지에 대한 장기 실행 프로세스에서 선호되는 플래그입니다.

--sequential, -s#

추가된 버전: v11.14.0

선택한 스크립트를 하나씩 차례로 실행합니다. 이 옵션은 --workspace-concurrency를 1로 강제하므로, 정규식 선택자로 매칭된 스크립트는 워크스페이스 패키지 간이든 단일 패키지 내에서든 절대 겹치지 않습니다.

pnpm run --sequential "/^build:.*/"

재귀 실행에서는 각 워크스페이스 프로젝트 내부뿐 아니라 프로젝트 간에도 스크립트를 직렬화합니다. --sequential은 --parallel보다 우선합니다: 이 옵션이 설정되면 두 플래그가 나타나는 순서와 관계없이 동시성이 1로 고정됩니다.

참고

pnpm run에서 -s는 --sequential의 축약형입니다. CLI의 다른 모든 곳에서 -s는 여전히 --reporter=silent의 축약형입니다. 긴 형식인 --silent는 모든 명령에서 영향을 받지 않습니다.

--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으로는 실행할 수 없습니다.