package.json
O arquivo de manifesto de um pacote. Contém todos os metadados do pacote, incluindo dependências, título, autor e etc. Este é um padrão preservado por todos os principais gerenciadores de pacotes do Node.JS, incluindo o pnpm.
engines
Você pode especificar a versão do Node e do pnpm em que o seu software funciona:
{
"engines": {
"node": ">=10",
"pnpm": ">=3"
}
}
Durante o desenvolvimento local, o pnpm sempre falhará com uma mensagem de erro se sua versão não corresponder à especificada no campo engines.
A menos que o usuário tenha definido a flag de configuração engine-strict (veja .npmrc), esse campo é apenas consultivo e só produzirá avisos quando seu pacote for instalado como dependência.
dependenciesMeta
Informações meta adicionais usadas para dependências declaradas dentro de dependencies, optionalDependencies, e devDependencies.
dependenciesMeta.*.injected
If this is set to true for a local dependency, the package will be hard linked to the modules directory, not symlinked.
Por exemplo, o seguinte package.json num espaço de trabalho criará um link simbólico para button no diretório node_modules de card:
{
"name": "card",
"dependencies": {
"button": "workspace:1.0.0"
}
}
Mas e se button tiver react em suas dependências? Se todos os projetos no monorepo usarem as mesmas versões de react, então não há problema. Mas e se button for exigido por card que usa react@16 e form com react@17? Sem usar inject, você teria que escolher uma única versão de react e instalá-la como dependência de desenvolvimento de button. Mas usando o campo injected você pode injetar button em um pacote, e button será instalado com o react na versão desse pacote.
Então esse será o package.json de card:
{
"name": "card",
"dependencies": {
"button": "workspace:1.0.0",
"react": "16"
},
"dependenciesMeta": {
"button": {
"injected": true
}
}
}
button será vinculado fisicamente às dependências de card, e react@16 será linkado simbolicamente as dependências de card/node_modules/button.
E esse será o package.json de form:
{
"name": "form",
"dependencies": {
"button": "workspace:1.0.0",
"react": "17"
},
"dependenciesMeta": {
"button": {
"injected": true
}
}
}
button será linkado fisicamente às dependências de form, e react@17 será linkado simbolicamente as dependências de form/node_modules/button.
peerDependenciesMeta
This field lists some extra information related to the dependencies listed in the peerDependencies field.
peerDependenciesMeta.*.optional
If this is set to true, the selected peer dependency will be marked as optional by the package manager. Therefore, the consumer omitting it will no longer be reported as an error.
Por exemplo:
{
"peerDependencies": {
"foo": "1"
},
"peerDependenciesMeta": {
"foo": {
"optional": true
},
"bar": {
"optional": true
}
}
}