Engineering

pnpm 11

pnpm 11 워크스페이스, catalog, 공급망 정책을 재현 가능한 모노레포 운영에 적용합니다.

검증일 근거 자료

워크스페이스 계약

pnpm-workspace.yaml은 패키지 탐색뿐 아니라 catalog, 빌드 스크립트 허용, 공급망 정책의 중심입니다. 공통 버전은 catalog에 고정하고 내부 의존성은 workspace:*로 선언해 로컬 패키지가 아닌 레지스트리 버전을 잘못 설치하는 일을 막습니다.

packages:
  - "apps/*"
  - "packages/*"

catalog:
  typescript: "6.0.3"
  react: "19.2.7"

잠금 파일과 재현성

CI에서는 lockfile 변경을 허용하지 않는 설치를 사용합니다. 패키지 manifest를 바꾼 뒤 lockfile을 갱신하지 않은 상태를 통과시키지 않습니다. Node와 pnpm 버전도 engines, packageManager, 버전 파일에 함께 기록합니다.

빌드 스크립트 정책

네이티브 패키지의 install script는 공급망 위험이 될 수 있습니다. 필요한 패키지만 allowBuilds 또는 승인 목록에 명시하고, 새 스크립트가 등장하면 출처와 필요성을 검토합니다.

실전 팁

  • pnpm --filter @scope/name run build로 앱별 명령을 만들고 루트는 조합만 담당합니다.
  • 고정이 계약인 도구는 caret 없이 정확한 버전을 사용합니다.
  • peer 문제는 설치 경고로 남겨두지 말고 pnpm peers check로 원인을 확인합니다.
  • generated artifact가 패키지 build에 필요한지 source condition으로 대체 가능한지 먼저 판단합니다.

실패 사례

전역 pnpm에 의존

개발자마다 다른 pnpm이 lockfile 형식과 정책을 바꿀 수 있습니다. packageManager를 고정하고 CI와 로컬에서 같은 버전을 실행합니다.

모든 install script 허용

편의를 위해 정책을 해제하면 간접 의존성도 임의 코드를 실행합니다. esbuild, sharp처럼 실제로 필요한 항목만 좁게 허용합니다.