package.json
패키지의 매니페스트 파일입니다. 여기에는 의존성, 제목, 작성자 등을 포함한 모든 패키지의 메타데이터가 포함됩니다. 이것은 pnpm을 포함한 모든 주요 Node.js 패키지 관리자에서 유지되는 표준입니다.
engines
소프트웨어가 작동하는 Node 및 pnpm의 버전을 지정할 수 있습니다.
{
"engines": {
"node": ">=10",
"pnpm": ">=3"
}
}
로컬 개발 중에 버전이 engines
필드에 지정된 버전과 일치하지 않으면 pnpm은 항상 오류 메시지와 함께 실패합니다.
사용자가 engine-strict
구성 플래그를 설정하지 않은 경우( .npmrc참조), 이 필드는 권고 사항일 뿐이며 패키지가 의존성으로 설치된 경우에만 경고를 생성합니다.
dependenciesMeta
dependenciesMeta.*.injected
로컬 의존성에 대해 true로 설정되면, 패키지는 심볼릭 링크가 아닌 모듈 디렉토리에 하드 링크됩니다.
예를 들어, 워크스페이스의 다음 package.json
은 card
의 node_modules
디렉토리에 있는 button
에 대한 심볼릭 링크를 생성합니다.
{
"name": "card",
"dependencies": {
"button": "workspace:1.0.0"
}
}
그러나 button
의 피어 의존성에 react
이 있으면 어떻게 될까요? monorepo의 모든 프로젝트가 동일한 버전의 react
를 사용하면 문제가 없습니다. 그러나, react@16
을 사용하는 card
와 react@17
을 사용하는 form
를 button
이 필요하다면 어떻게 될까요? inject
을 사용하지 않고, react
의 단일 버전을 선택하고 button
의 개발 의존성으로 설치해야 합니다. 그러나 inject
필드를 사용하면, button
을 패키지에 주입할 수 있으며, button
은 해당 패키지의 react
버전과 함께 설치됩니다.
그래서 이것은 card
의 package.json
이 됩니다.
{
"name": "card",
"dependencies": {
"button": "workspace:1.0.0",
"react": "16"
},
"dependenciesMeta": {
"button": {
"injected": true
}
}
}
button
은 card
의 의존성에 하드 링크되고, react@16
은 card/node_modules/button
의 의존성에 심볼릭 링크됩니다.
그래서 이것은 card
의 package.json
이 됩니다.
{
"name": "form",
"dependencies": {
"button": "workspace:1.0.0",
"react": "17"
},
"dependenciesMeta": {
"button": {
"injected": true
}
}
}
button
은 form
의 의존성에 하드 링크되고, react@17
은 card/node_modules/button
의 의존성에 심볼릭 링크됩니다.
peerDependenciesMeta
이 필드는 peerDependencies
필드에 나열된 의존성과 관련된 몇 가지 추가 정보를 나열합니다.
peerDependenciesMeta.*.optional
true로 설정하면, 선택한 피어 의존성이 패키지 관리자에 의해 optional로 표시됩니다. 따라서 소비자가 이를 생략하면 더 이상 이 오류로 보고되지 않습니다.
예:
{
"peerDependencies": {
"foo": "1"
},
"peerDependenciesMeta": {
"foo": {
"optional": true
},
"bar": {
"optional": true
}
}
}
peerDependencies
에 bar
가 지정되지 않았더라도, 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>zoo
는 qar@1
의 zoo
의존성만 재정의하고, 다른 의존성을 재정의하지 않습니다.
pnpm.packageExtensions
packageExtensions
필드는 추가 정보로 기존 패키지 정의를 확장하는 방법을 제공합니다. 예를 들어, react-redux
이 peerDependencies
에 react-dom
이 있어야 하지만 그렇지 않은 경우, packageExtensions
를 사용하여 react-redux
를 패치할 수 있습니다.
{
"pnpm": {
"packageExtensions": {
"react-redux": {
"peerDependencies": {
"react-dom": "*"
}
}
}
}
}
packageExtensions
의 키는 패키지 이름이거나 패키지 이름 및 semver 범위임에 따라, 패키지의 일부 버전만 패치할 수 있습니다.
{
"pnpm": {
"packageExtensions": {
"react-redux@1": {
"peerDependencies": {
"react-dom": "*"
}
}
}
}
}
다음 필드는 packageExtensions
를 사용하여 확장할 수 있습니다: dependencies
, optionalDependencies
, peerDependencies
및 peerDependenciesMeta
.
더 큰 예:
{
"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"
}
}