.pnpmfile.cjs
pnpm을 사용하면 특수 기능 (후크)을 통해 설치 프로세스에 직접 연결할 수 있습니다. 후크는 .pnpmfile.cjs라는 파일에 선언할 수 있습니다.
기본적으로 .pnpmfile.cjs는 lockfile과 같은 디렉터리에 위치해야 합니다. 예를 들어 lockfile을 공유하는 워크스페이스에서는 .pnpmfile.cjs가 모노레포의 루트에 있어야 합니다.
후크#
요약#
| 후크 함수 | 처리 | 사용 |
|---|---|---|
hooks.readPackage(pkg, context): pkg | pnpm이 의존성 패키지 매니페스트를 파싱한 후에 호출됩니다. | 종속성의 package.json을 변경할 수 있습니다 |
hooks.afterAllResolved(lockfile, context): lockfile | 의존성이 해결된 후에 호출됩니다. | lockfile을 변경할 수 있습니다. |
hooks.beforePacking(pkg): pkg | 패키지를 pack/publish하는 중 tarball을 생성하기 전에 호출됩니다 | 게시되는 package.json을 사용자 지정할 수 있습니다 |
hooks.readPackage(pkg, context): pkg | Promise<pkg>#
파싱 후 해석 전에 종속성의 package.json을 변경할 수 있습니다. 이러한 변형은 파일시스템에 저장되지 않지만, lockfile에서 해결되는 내용과 이에 따라 설치되는 내용에 영향을 줍니다.
이미 수정하려는 종속성을 해석한 경우에는 pnpm-lock.yaml을 삭제해야 한다는 점에 유의하세요.
팁
package.json 변경 사항을 파일시스템에 저장해야 한다면 pnpm patch 명령을 사용하여 package.json 파일을 패치해야 합니다.
예를 들어 종속성의 bin 필드를 제거하려는 경우에 유용할 수 있습니다.
인수#
pkg- 패키지의 매니페스트입니다. 레지스트리의 응답 또는package.json내용입니다.context- 해당 단계의 컨텍스트 객체입니다. 메서드#log(msg)를 사용하면 해당 단계의 디버그 로그를 남길 수 있습니다.
사용#
예시 .pnpmfile.cjs(종속성의 종속성을 변경):
function readPackage(pkg, context) {
// Override the manifest of foo@1.x after downloading it from the registry
if (pkg.name === 'foo' && pkg.version.startsWith('1.')) {
// Replace bar@x.x.x with bar@2.0.0
pkg.dependencies = {
...pkg.dependencies,
bar: '^2.0.0'
}
context.log('bar@1 => bar@2 in dependencies of foo')
}
// This will change any packages using baz@x.x.x to use baz@1.2.3
if (pkg.dependencies.baz) {
pkg.dependencies.baz = '1.2.3';
}
return pkg
}
module.exports = {
hooks: {
readPackage
}
}
알려진 제약 사항#
readPackage를 통해 종속성 매니페스트에서 scripts 필드를 제거해도 pnpm이 해당 종속성을 빌드하는 것을 막지는 못합니다. 종속성을 빌드할 때 pnpm은 패키지 아카이브에서 패키지의 package.json을 읽으며, 이는 훅의 영향을 받지 않습니다. 패키지의 빌드를 무시하려면 neverBuiltDependencies 필드를 사용하세요.
hooks.updateConfig(config): config | Promise<config>#
버전 10.8.0에서 추가됨
이 훅으로 pnpm에서 사용하는 설정을 수정할 수 있습니다. 이 훅은 configDependencies와 함께 사용할 때 가장 유용하며, 여러 Git 리포지토리 간에 설정을 공유하고 재사용할 수 있습니다.
예를 들어 @pnpm/plugin-better-defaults는 updateConfig 훅을 사용하여 엄선된 권장 설정을 적용합니다.
사용 예#
module.exports = {
hooks: {
updateConfig (config) {
return Object.assign(config, {
enablePrePostScripts: false,
optimisticRepeatInstall: true,
resolutionMode: 'lowest-direct',
verifyDepsBeforeRun: 'install',
})
}
}
}
hooks.afterAllResolved(lockfile, context): lockfile | Promise<lockfile>#
직렬화되기 전에 lockfile 결과를 변경할 수 있습니다.
인수#
lockfile-pnpm-lock.yaml로 직렬화되는 lockfile 해석 객체입니다.context- 해당 단계의 컨텍스트 객체입니다. 메서드#log(msg)를 사용하면 해당 단계의 디버그 로그를 남길 수 있습니다.
사용 예#
function afterAllResolved(lockfile, context) {
// ...
return lockfile
}
module.exports = {
hooks: {
afterAllResolved
}
}
알려진 제약사항#
lockfile로 할 수 있는 모든 것은 이 함수를 통해 수 있으며, lockfile의 기능을 확장할 수도 있습니다.
hooks.beforePacking(pkg): pkg | Promise<pkg>#
추가된 버전: v10.28.0
pnpm pack 또는 pnpm publish 중 tarball로 패킹되기 전에 package.json 매니페스트를 수정할 수 있습니다. 로컬 개발용 package.json에 영향을 주지 않고 게시되는 패키지를 사용자 지정할 때 유용합니다.
설치 중 종속성이 해석되는 방식을 수정하는 hooks.readPackage와 달리 beforePacking은 게시되는 tarball의 내용에만 영향을 줍니다.
인수#
pkg- 게시되는 tarball에 포함될 패키지 매니페스트 객체입니다.
사용 예#
function beforePacking(pkg) {
// Remove development-only fields from published package
delete pkg.devDependencies
delete pkg.scripts.test
// Add publication metadata
pkg.publishedAt = new Date().toISOString()
// Modify package exports for production
if (pkg.name === 'my-package') {
pkg.main = './dist/index.js'
}
return pkg
}
module.exports = {
hooks: {
beforePacking
}
}
참고
이 훅이 만드는 수정 사항은 tarball 내부의 package.json에만 영향을 줍니다. 로컬 package.json 파일은 변경되지 않습니다.
hooks.preResolution(options): Promise<void>#
이 훅은 프로젝트의 lockfile을 읽고 파싱한 후, 종속성을 해석하기 전에 실행됩니다. 이 훅으로 lockfile 객체를 수정할 수 있습니다.
인수#
options.existsCurrentLockfile-node_modules/.pnpm/lock.yaml의 lockfile이 존재하면 true인 불리언 값입니다.options.currentLockfile-node_modules/.pnpm/lock.yaml의 lockfile 객체입니다.options.existsNonEmptyWantedLockfile-pnpm-lock.yaml의 lockfile이 존재하면 true인 불리언 값입니다.options.wantedLockfile-pnpm-lock.yaml의 lockfile 객체입니다.options.lockfileDir- 대상 lockfile이 있는 디렉터리입니다.options.storeDir- 스토어 디렉터리의 위치입니다.options.registries- 스코프를 레지스트리 URL에 매핑한 맵입니다.
hooks.importPackage(destinationDir, options): Promise<string | undefined>#
이 훅으로 패키지가 node_modules에 기록되는 방식을 변경할 수 있습니다. 반환 값은 선택 사항이며 종속성을 가져오는 데 사용된 방식을 나타냅니다. 예: clone, hardlink.
인수#
destinationDir- The destination directory where the package should be written.options.disableRelinkLocalDirDepsoptions.filesMapoptions.forceoptions.resolvedFromoptions.keepModulesDir
hooks.fetchers#
This hook allows to override the fetchers that are used for different types of dependencies. It is an object that may have the following fields:
localTarballremoteTarballgitHostedTarballdirectorygit
파인더#
버전 10.16.0에서 추가됨
파인더 함수는 pnpm list 및 pnpm why와 함께 --find-by 플래그로 사용됩니다.
예시:
module.exports = {
finders: {
react17: (ctx) => {
return ctx.readManifest().peerDependencies?.react === "^17.0.0"
}
}
}
사용법:
pnpm why --find-by=react17
자세한 내용은 Finders를 참조하세요.
관련 구성#
ignorePnpmfile#
- 기본값: false
- 유형: Boolean
.pnpmfile.cjs가 무시됩니다. 설치 중에 어떤 스크립트도 실행되지 않도록 하고 싶을 때
--ignore-scripts와 함께 사용하면 유용합니다.
pnpmfile#
- 기본값: ['.pnpmfile.cjs']
- 유형: path[]
- 예시: ['.pnpm/.pnpmfile.cjs']
로컬 pnpmfile(들)의 위치입니다.
globalPnpmfile#
- 기본값: null
- 유형: path
- 예시: ~/.pnpm/global_pnpmfile.cjs
전역 pnpmfile의 위치입니다. 전역 pnpmfile은 설치하는 동안 모든 프로젝트에서 사용됩니다.
참고
로컬 pnpmfile를 사용하는 것이 좋습니다. pnpm을 기본 패키지 관리자로 사용하지 않는 프로젝트에서 pnpm을 사용하는 경우에만 전역 pnpmfile을 사용하십시오.