본문으로 건너뛰기
버전: Next

package.json

패키지의 매니페스트 파일입니다. 여기에는 의존성, 제목, 작성자 등을 포함한 모든 패키지의 메타데이터가 포함됩니다. 이것은 pnpm을 포함한 모든 주요 Node.js 패키지 관리자에서 유지되는 표준입니다.

engines

소프트웨어가 작동하는 Node 및 pnpm의 버전을 지정할 수 있습니다.

{
"engines": {
"node": ">=10",
"pnpm": ">=3"
}
}

로컬 개발 중에 버전이 engines 필드에 지정된 버전과 일치하지 않으면 pnpm은 항상 오류 메시지와 함께 실패합니다.

사용자가 engine-strict 구성 플래그를 설정하지 않은 경우( .npmrc참조), 이 필드는 권고 사항일 뿐이며 패키지가 의존성으로 설치된 경우에만 경고를 생성합니다.

dependenciesMeta

dependenciesMeta.*.injected

로컬 의존성에 대해 true로 설정되면, 패키지는 심볼릭 링크가 아닌 모듈 디렉토리에 하드 링크됩니다.

예를 들어, 워크스페이스의 다음 package.jsoncardnode_modules 디렉토리에 있는 button 에 대한 심볼릭 링크를 생성합니다.

{
"name": "card",
"dependencies": {
"button": "workspace:1.0.0"
}
}

그러나 button 의 피어 의존성에 react 이 있으면 어떻게 될까요? monorepo의 모든 프로젝트가 동일한 버전의 react 를 사용하면 문제가 없습니다. 그러나, react@16을 사용하는 cardreact@17을 사용하는 formbutton이 필요하다면 어떻게 될까요? inject을 사용하지 않고, react 의 단일 버전을 선택하고 button의 개발 의존성으로 설치해야 합니다. 그러나 inject 필드를 사용하면, button 을 패키지에 주입할 수 있으며, button 은 해당 패키지의 react 버전과 함께 설치됩니다.

그래서 이것은 cardpackage.json 이 됩니다.

{
"name": "card",
"dependencies": {
"button": "workspace:1.0.0",
"react": "16"
},
"dependenciesMeta": {
"button": {
"injected": true
}
}
}

buttoncard의 의존성에 하드 링크되고, react@16card/node_modules/button의 의존성에 심볼릭 링크됩니다.

그래서 이것은 cardpackage.json이 됩니다.

{
"name": "form",
"dependencies": {
"button": "workspace:1.0.0",
"react": "17"
},
"dependenciesMeta": {
"button": {
"injected": true
}
}
}

buttonform의 의존성에 하드 링크되고, react@17card/node_modules/button의 의존성에 심볼릭 링크됩니다.

peerDependenciesMeta

이 필드는 peerDependencies 필드에 나열된 의존성과 관련된 몇 가지 추가 정보를 나열합니다.

peerDependenciesMeta.*.optional

true로 설정하면, 선택한 피어 의존성이 패키지 관리자에 의해 optional로 표시됩니다. 따라서 소비자가 이를 생략하면 더 이상 이 오류로 보고되지 않습니다.

예:

{
"peerDependencies": {
"foo": "1"
},
"peerDependenciesMeta": {
"foo": {
"optional": true
},
"bar": {
"optional": true
}
}
}

peerDependenciesbar가 지정되지 않았더라도, optional로 표시됩니다. 따라서 pnpm은 모든 버전의 bar가 괜찮다고 가정합니다. 그러나 foo는 optional이지만 필수 버전 사양에만 해당됩니다.

publishConfig

패키지가 패킹되기 전에 매니페스트의 일부 필드를 재정의할 수 있습니다. 다음 필드를 재정의할 수 있습니다.

필드를 재정의하려면 필드의 게시 버전을 publishConfig에 추가하십시오.

예를 들어 다음 package.json은 다음과 같습니다.

{
"name": "foo",
"version": "1.0.0",
"main": "src/index.ts",
"publishConfig": {
"main": "lib/index.js",
"typings": "lib/index.d.ts"
}
}

다음과 같이 게시됩니다.

{
"name": "foo",
"version": "1.0.0",
"main": "lib/index.js",
"typings": "lib/index.d.ts"
}

publishConfig.executableFiles

기본적으로, 이식성을 위해, bin 필드에 나열된 파일을 제외한 어떤 파일도 결과 패키지 아카이브에서 실행 가능한 것으로 표시되지 않습니다. executableFiles 필드를 사용하면 bin 필드를 통해 직접 액세스할 수 없는 경우에도 실행 가능 플래그(+x)가 설정되어야 하는 추가 필드를 선언할 수 있습니다.

{
"publishConfig": {
"executableFiles": [
"./dist/shim.js"
]
}
}

publishConfig.directory

또한 필드 publishConfig.directory를 사용하여 현재 package.json을 기준으로 게시된 하위 디렉터리를 커스터마이징 할 수 있습니다.

지정된 디렉토리에 현재 패키지의 수정된 버전이 있을 때 사용할 수 있습니다 (일반적으로 타사 빌드 도구 사용).

이 예시에서 "dist" 폴더에는 package.json이 포함되어야 합니다.

{
"name": "foo",
"version": "1.0.0",
"publishConfig": {
"directory": "dist"
}
}

pnpm.overrides

이 필드를 사용하면 pnpm이 의존성 그래프 내의 의존성을 재정의하도록 지시할 수 있습니다. 이는 모든 패키지가 단일 버전의 의존성을 사용하도록 강제하거나, 수정 사항을 백포트하거나, 의존성을 포크로 교체하는 데 유용합니다.

참고로, 재정의 필드는 프로젝트의 루트에서만 설정할 수 있습니다.

"pnpm"."overrides" 필드의 예시:

{
"pnpm": {
"overrides": {
"foo": "^1.0.0",
"quux": "npm:@myorg/quux@^1.0.0",
"bar@^2.1.0": "3.0.0",
"qar@1>zoo": "2"
}
}
}

재정의된 종속성이 속한 패키지를 ">"를 통해 패키지 selector를 의존성 selector로부터 구분하여 지정할 수 있습니다. 예를 들어, qar@1>zooqar@1zoo 의존성만 재정의하고, 다른 의존성을 재정의하지 않습니다.

pnpm.packageExtensions

packageExtensions 필드는 추가 정보로 기존 패키지 정의를 확장하는 방법을 제공합니다. 예를 들어, react-reduxpeerDependenciesreact-dom이 있어야 하지만 그렇지 않은 경우, packageExtensions를 사용하여 react-redux를 패치할 수 있습니다.

{
"pnpm": {
"packageExtensions": {
"react-redux": {
"peerDependencies": {
"react-dom": "*"
}
}
}
}
}

packageExtensions의 키는 패키지 이름이거나 패키지 이름 및 semver 범위임에 따라, 패키지의 일부 버전만 패치할 수 있습니다.

{
"pnpm": {
"packageExtensions": {
"react-redux@1": {
"peerDependencies": {
"react-dom": "*"
}
}
}
}
}

다음 필드는 packageExtensions를 사용하여 확장할 수 있습니다: dependencies, optionalDependencies, peerDependenciespeerDependenciesMeta.

더 큰 예:

{
"pnpm": {
"packageExtensions": {
"express@1": {
"optionalDependencies": {
"typescript": "2"
}
},
"fork-ts-checker-webpack-plugin": {
"dependencies": {
"@babel/core": "1"
},
"peerDependencies": {
"eslint": ">= 6"
},
"peerDependenciesMeta": {
"eslint": {
"optional": true
}
}
}
}
}
}
tip

Yarn과 함께 우리는 생태계에서 손상된 패키지를 패치하기 위해 packageExtensions 의 데이터베이스를 유지 관리합니다. packageExtensions을 사용하는 경우, PR 업스트림을 보내고 확장을 @yarnpkg/extensions 데이터베이스에 제공하는 것을 고려하십시오.

pnpm.peerDependencyRules

pnpm.peerDependencyRules.ignoreMissing

pnpm은 이 목록에서 누락된 피어 의존성에 대한 경고를 출력하지 않습니다.

예를 들어, 다음 구성에서 pnpm은 의존성에 react 가 필요하지만 react이 설치되지 않은 경우 경고를 출력하지 않습니다.

{
"pnpm": {
"peerDependencyRules": {
"ignoreMissing": ["react"]
}
}
}

패키지 이름 패턴도 사용할 수 있습니다.

{
"pnpm": {
"peerDependencyRules": {
"ignoreMissing": ["@babel/*", "@eslint/*"]
}
}
}

pnpm.peerDependencyRules.allowedVersions

지정된 범위의 피어 의존성에 대해서는 충족되지 않은 피어 의존성 경고가 출력되지 않습니다.

예를 들어, react@16이 필요한 의존성이 있지만 react@17에서 잘 작동한다는 것을 알고 있다면, 다음 구성을 사용할 수 있습니다.

{
"pnpm": {
"peerDependencyRules": {
"allowedVersions": {
"react": "17"
}
}
}
}

이것은 피어 의존성에 react를 갖고 있는 모든 의존성이 react v17 설치를 허용해야 함을 pnpm에 알려줍니다.

pnpm.peerDependencyRules.allowAny

버전 7.3.0에서 추가됨

allowAny은 패키지 이름 패턴의 배열이며, 패턴과 일치하는 모든 피어 의존성은 peerDependencies에 지정된 범위에 관계없이 모든 버전에서 확인됩니다. 예를 들어:

{
"pnpm": {
"peerDependencyRules": {
"allowAny": ["@babel/*", "eslint"]
}
}
}

위의 설정은 @babel/ 패키지 또는 eslint와 관련된 피어 의존성에 버전 불일치 경고를 음소거합니다.

pnpm.neverBuiltDependencies

이 필드를 사용하면 특정 의존성의 빌드를 무시할 수 있습니다. 나열된 패키지의 "preinstall", "install" 및 "postinstall" 스크립트는 설치 중에 실행되지 않습니다.

"pnpm"."neverBuiltDependencies" 필드의 예시:

{
"pnpm": {
"neverBuiltDependencies": ["fsevents", "level"]
}
}

pnpm.onlyBuiltDependencies

설치 중에 실행할 수 있는 패키지 이름 목록입니다. 이 필드가 있으면 나열된 패키지만 install 스크립트를 실행할 수 있습니다.

예시:

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

pnpm.allowedDeprecatedVersions

버전 7.2.0에서 추가됨

이 설정을 사용하면 특정 패키지의 사용 중단 경고를 음소거할 수 있습니다.

예시:

{
"pnpm": {
"allowedDeprecatedVersions": {
"express": "1",
"request": "*"
}
}
}

위의 구성으로 pnpm은 request 의 모든 버전과 express의 버전 1에 대한 사용 중단 경고를 출력하지 않습니다.

pnpm.patchedDependencies

버전 7.4.0에서 추가됨

이 필드는 pnpm patch-commit을 실행할 때 자동으로 추가/업데이트됩니다. 키가 패키지 이름과 정확한 버전이어야 하는 딕셔너리입니다. 값은 패치 파일에 대한 상대 경로여야 합니다.

예시:

{
"pnpm": {
"express@4.18.1": "patches/express@4.18.1.patch"
}
}