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
}
}
}