pnpm 10 주요 변경 사항 정리

pnpm 10 주요 변경 사항 정리

pnpm 10이 출시되면서 몇 가지 중요한 변경 사항이 적용되었는데요.


이번 업데이트에서는 보안 강화, 성능 개선, 설정 변경 및 새로운 기능 추가가 이루어졌습니다.

 

Lifecycle 스크립트 기본 비활성화


pnpm link 동작 변경


SHA256 기반 보안 해싱 적용


설정 변경 및 새로운 설정 추가


글로벌 스토어 구조 개선


기타 주요 Breaking Changes

 

하나씩 자세히 살펴보겠습니다! 👀


1️. Lifecycle 스크립트 기본 비활성화 (보안 강화)

이제부터 의존성(Dependencies)의 Lifecycle 스크립트가 기본적으로 실행되지 않습니다.


이는 보안 강화를 위한 조치이며, 특정 패키지의 Lifecycle 스크립트를 허용하려면


package.jsonpnpm.onlyBuiltDependencies 필드를 추가해야 합니다.

 

예제: 특정 패키지의 Lifecycle 스크립트 허용하기

{
  "pnpm": {
    "onlyBuiltDependencies": ["fsevents"]
  }
}

 2️. pnpm link 동작 변경

워크스페이스 내에서 pnpm link 실행 시:

  • 최상위 package.jsonoverrides 속성이 추가됨
  • 워크스페이스 내 모든 프로젝트에 적용됨

글로벌 링크(pnpm link -g) 변경

이제 패키지 디렉터리에서 pnpm link를 실행하면 자동으로 글로벌 링크가 적용됩니다.


(이전에는 pnpm link -g를 사용해야 했음)

 

관련 PR: #8653

 

feat!: the link command should add overrides by zkochan · Pull Request #8653 · pnpm/pnpm

Breaking changes to the pnpm link command. Now the link command adds overrides to the root package.json. In a workspace the override is added to the root of the workspace, so it links the dependenc...

github.com

 


3️. SHA256 기반 보안 해싱 적용

보안을 강화하기 위해 다양한 해싱 알고리즘이 SHA256으로 변경되었습니다.

SHA256이 적용된 영역

  • node_modules/.pnpm 안의 긴 경로 해시
  • pnpm-lock.yamlpeer dependency 해시 (기존 MD5 → SHA256)
  • packageExtensionsChecksum 필드
  • 사이드 이펙트 캐시(Side Effects Cache)의 키
  • pnpmfile 체크섬

관련 PR: #8530

 

feat!: use SHA256 for hashing the pnpmfile content by zkochan · Pull Request #8530 · pnpm/pnpm

 

github.com

 


 4️. 설정 변경 및 새로운 설정 추가

기본 설정 변경

설정 변경사항
manage-package-manager-versions 기본적으로 활성화됨 (pnpm이 package.jsonpackageManager 필드를 기반으로 버전 관리)
public-hoist-pattern 기본적으로 hoist(루트 이동) 비활성화됨 (eslint, prettier 포함)
virtual-store-dir-max-length Windows 기본값 60자로 축소됨

 

관련 이슈: #8378

 

Remove the default option `*eslint*` and `*prettier*` from `public-hoist-pattern` option in next major version · Issue #8378 ·

Contribution I'd be willing to implement this feature (contributing guide) Describe the user story Eslint 9 support flat config. We don't need to hoist modules about eslint any more. Prettier plugi...

github.com

 

새로운 설정 추가

설정 설명
verify-deps-before-run node_modules가 최신 상태인지 확인 후 스크립트 실행
inject-workspace-packages 워크스페이스 의존성을 하드 링크로 연결 (기본값: symlink)

관련 PR: #8836

 

feat: a new setting for injecting workspace packages by zkochan · Pull Request #8836 · pnpm/pnpm

 

github.com

 


5️. 글로벌 스토어 변경 사항

스토어 버전이 v10으로 변경됨

패키지 해시 저장 방식 개선

  • 일부 레지스트리에서는 같은 콘텐츠를 다른 패키지 이름이나 버전으로 배포할 수 있음
  • 이를 해결하기 위해 인덱스 파일을 콘텐츠 해시 + 패키지 식별자로 저장

관련 PR: #8510

 

feat: adding the package name into the index file name by zkochan · Pull Request #8510 · pnpm/pnpm

close #8204 Some registries allow identical content to be published under different package names or versions. To accommodate this, index files in the store are now stored using both the content ha...

github.com

 

 

관련 이슈: #8204

 

Changing the index files name in the package store · Issue #8204 · pnpm/pnpm

Contribution I'd be willing to implement this feature (contributing guide) Describe the user story We currently save index files by the integrity of the package. We also save the name and version o...

github.com

 

사이드 이펙트 인덱싱 최적화

  • 패키지의 모든 파일을 저장하는 대신, 변경된 파일만 추적하도록 개선

관련 PR: #8636

 

6️. 기타 주요 Breaking Changes

# 문자가 node_modules/.pnpm 내부 디렉터리에서 이제 자동으로 이스케이프됨

관련 PR: #8557

 

fix(dependency-path)!: escape `#` character in directory name by hi-ogawa · Pull Request #8557 · pnpm/pnpm

Closes # character when installing from Git is incompatible with Vite #8437 Closes Fail to load packages installed from Git repo with pnpm v9 vitejs/vite#17459 Using a local build of this PR, I ve...

github.com

 

 pnpm add --global pnpm 실행 불가

이제 pnpm을 글로벌 설치하려면 pnpm self-update를 사용해야 합니다.
관련 PR: #8728

URL로 추가한 의존성은 lockfile에 최종 URL이 저장됨

관련 이슈: #8833

 

avoid caching original tarball urls with redirections · Issue #8833 · pnpm/pnpm

Verify latest release I verified that the issue exists in the latest pnpm release pnpm version No response Which area(s) of pnpm are affected? (leave empty if unsure) CLI, Lockfile, Store Link to t...

github.com

 

pnpm deploy 제한 사항 추가

  • inject-workspace-packages=true 설정이 없으면 pnpm deploy 불가능
    관련 PR: #8619
 

fix!: the test command should pass all args to the underlying script by zkochan · Pull Request #8619 · pnpm/pnpm

 

github.com

 pnpm test 실행 방식 변경

  • 이제 test 스크립트 뒤의 모든 인수를 그대로 전달
  • 기존에는 -- 프리픽스를 붙여야 했음

 관련 PR: #8619

 

fix!: the test command should pass all args to the underlying script by zkochan · Pull Request #8619 · pnpm/pnpm

 

github.com

 


7️. 새로운 기능 추가

 설정 전용 의존성 (Configurational Dependencies) 지원

  • dependencies보다 먼저 설치되는 특별한 의존성
  • 의존성을 가질 수 없고, 정확한 버전 및 체크섬을 사용해야 함
{
  "pnpm": {
    "configDependencies": {
      "my-configs": "1.0.0+sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="
    }
  }
}

 

관련 RFC: #8

 

Configurational dependencies by zkochan · Pull Request #8 · pnpm/rfcs

Implementation: pnpm/pnpm#8915

github.com

 

 

관련 PR: #8915

 

feat: configurational dependencies by zkochan · Pull Request #8915 · pnpm/pnpm

Related RFC: pnpm/rfcs#8

github.com

 


8️. 성능 개선 및 최적화

반복 설치 속도 개선

  • pnpm install 시, node_modules가 최신 상태인지 빠르게 확인하여 불필요한 설치 방지
    📌 관련 PR: #8838

 

pnpm add가 워크스페이스 기본 카탈로그와 통합

  • pnpm add 실행 시, 워크스페이스 내 기존 패키지와 버전 매칭하여 catalog: 프로토콜 사용
    📌 관련 이슈: #8640

 

pnpm dlx가 최신 버전 패키지를 정확하게 설치하도록 개선

📌 관련 PR: #8811

 


 마무리하며

pnpm 10은 보안, 성능, 설정, 글로벌 스토어 개선을 포함한 대규모 업데이트입니다.


특히 SHA256 보안 강화, Lifecycle 스크립트 제한, pnpm link 동작 변경 등의 변화는 꼭 숙지해야 합니다.

 

 pnpm을 사용한다면, 이 변경 사항을 잘 확인하고 프로젝트에 적용해 보세요!