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 플래그를 사용하여 non-zero 종료 코드 로 종료되는 것을 방지할 수 있습니다. 이렇게 하면 실행 체인을 끊지 않고 정의되지 않았을 수도 있는 스크립트를 실행할 수 있습니다.

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