.pnpmfile.cjs

pnpm을 사용하면 특수 기능 (후크)을 통해 설치 프로세스에 직접 연결할 수 있습니다. 후크는 .pnpmfile.cjs라는 파일에 선언할 수 있습니다.

기본적으로 .pnpmfile.cjs는 lockfile과 같은 디렉터리에 위치해야 합니다. 예를 들어 lockfile을 공유하는 워크스페이스에서는 .pnpmfile.cjs가 모노레포의 루트에 있어야 합니다.

후크#

요약#

후크 함수처리사용
hooks.readPackage(pkg, context): pkgpnpm이 의존성 패키지 매니페스트를 파싱한 후에 호출됩니다.종속성의 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 훅을 사용하여 엄선된 권장 설정을 적용합니다.

사용 예#

.pnpmfile.cjs
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)를 사용하면 해당 단계의 디버그 로그를 남길 수 있습니다.

사용 예#

.pnpmfile.cjs
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에 포함될 패키지 매니페스트 객체입니다.

사용 예#

.pnpmfile.cjs
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.disableRelinkLocalDirDeps
  • options.filesMap
  • options.force
  • options.resolvedFrom
  • options.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:

  • localTarball
  • remoteTarball
  • gitHostedTarball
  • directory
  • git

파인더#

버전 10.16.0에서 추가됨

파인더 함수는 pnpm list 및 pnpm why와 함께 --find-by 플래그로 사용됩니다.

예시:

.pnpmfile.cjs
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을 사용하십시오.