
pnpm 10 주요 변경 사항 정리
pnpm 10이 출시되면서 몇 가지 중요한 변경 사항이 적용되었는데요.
이번 업데이트에서는 보안 강화, 성능 개선, 설정 변경 및 새로운 기능 추가가 이루어졌습니다.
✅ Lifecycle 스크립트 기본 비활성화
✅ pnpm link 동작 변경
✅ SHA256 기반 보안 해싱 적용
✅ 설정 변경 및 새로운 설정 추가
✅ 글로벌 스토어 구조 개선
✅ 기타 주요 Breaking Changes
하나씩 자세히 살펴보겠습니다! 👀
1️. Lifecycle 스크립트 기본 비활성화 (보안 강화)
이제부터 의존성(Dependencies)의 Lifecycle 스크립트가 기본적으로 실행되지 않습니다.
이는 보안 강화를 위한 조치이며, 특정 패키지의 Lifecycle 스크립트를 허용하려면
package.json에 pnpm.onlyBuiltDependencies 필드를 추가해야 합니다.
예제: 특정 패키지의 Lifecycle 스크립트 허용하기
{
"pnpm": {
"onlyBuiltDependencies": ["fsevents"]
}
}
2️. pnpm link 동작 변경
워크스페이스 내에서 pnpm link 실행 시:
- 최상위
package.json에overrides속성이 추가됨 - 워크스페이스 내 모든 프로젝트에 적용됨
글로벌 링크(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.yaml내 peer 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.json의 packageManager 필드를 기반으로 버전 관리) |
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을 사용한다면, 이 변경 사항을 잘 확인하고 프로젝트에 적용해 보세요!
'Javascript' 카테고리의 다른 글
| 타입스크립트 Enum 정복: 실전 가이드 & 완벽 대안 (1) | 2025.01.21 |
|---|---|
| 자바스크립트 정규 표현식의 새로운 힘! 패턴 수정자 알아볼까요? (1) | 2025.01.13 |
| ECMAScript 2025에 포함될 Import Attributes, 무엇이 달라질까? (0) | 2025.01.13 |
| Node.js, 이제 TypeScript를 기본 지원한다! (0) | 2025.01.13 |
| Node.js에서 AsyncLocalStorage로 비동기 컨텍스트 관리 간소화하기 (0) | 2025.01.08 |