Pré-publicação
napi pre-publish (também disponível como napi prepublish) prepara e publica
os pacotes de cada plataforma usando a versão atual do pacote raiz. Ele também
pode criar uma release no GitHub e enviar os binários nativos como assets.
WARNING
Por padrão, este comando causa efeitos colaterais na rede e no registry. Não é uma prévia do empacotamento: ele pode publicar várias versões npm imutáveis antes de o pacote raiz ser publicado. Execute-o apenas em um job de release controlado.
O comando não coleta nem copia artefatos de build. Execute napi artifacts antes.
Uso
napi pre-publish [--options]
import { NapiCli } from '@napi-rs/cli'
await new NapiCli().prePublish({
tagStyle: 'npm',
ghRelease: true,
})
Opções booleanas aceitam o prefixo --no-. Por exemplo, use
--no-gh-release quando a release não for executada no GitHub.
Opções
| Opção | Sintaxe da CLI | Tipo | Obrigatória | Padrão | Descrição |
|---|---|---|---|---|---|
cwd |
--cwd |
string |
Não | process.cwd() |
Diretório de trabalho. Todos os outros caminhos relativos partem daqui. |
configPath |
--config-path,-c |
string |
Não | Arquivo JSON separado de configuração napi. | |
packageJsonPath |
--package-json-path |
string |
Não | package.json |
Metadados e versão de release do pacote raiz. |
npmDir |
--npm-dir,-p |
string |
Não | npm |
Diretório que contém um pacote preparado para cada target configurado. |
tagStyle |
--tag-style,--tagstyle,-t |
npm | lerna |
Não | lerna |
Forma de resolver a tag da release no GitHub. npm usa v<versão do pacote>; lerna lê a tag do pacote no commit de release mais recente. |
ghRelease |
--gh-release |
boolean |
Não | true |
Cria/localiza uma release no GitHub e envia os binários dos targets quando há metadados de repositório GitHub. |
ghReleaseName |
--gh-release-name |
string |
Não | Nome enviado ao criar a release no GitHub. | |
ghReleaseId |
--gh-release-id |
string |
Não | ID numérico de uma release existente que receberá os assets. Nenhuma release nova é criada. | |
skipOptionalPublish |
--skip-optional-publish |
boolean |
Não | false |
Não executa o comando publish do gerenciador para os pacotes de plataforma. Atualizações de metadados e uploads de assets habilitados ainda acontecem. |
dryRun |
--dry-run |
boolean |
Não | false |
Ignora alterações nos arquivos, publicação npm, criação de release e upload de assets. |
Efeitos colaterais exatos
Sem --dry-run, o comando executa estas etapas em ordem:
- Lê o pacote raiz e a configuração napi.
- Define a
versionde cada pacote de plataforma configurado como a versão raiz. - Mescla em
optionalDependenciesdo pacote raiz uma entrada de versão exata para cada pacote de plataforma configurado. Entradas existentes são preservadas, inclusive pacotes de targets obsoletos. - Com releases GitHub habilitadas, resolve os metadados pelo último commit Git
e por
GITHUB_REPOSITORY; então cria a release, a menos que--gh-release-idescolha uma existente. - Para cada target cujo arquivo
.nodeou.wasmesperado exista no diretório npm, executa<npmClient> publish, salvo se--skip-optional-publishestiver definido. - Com releases GitHub habilitadas, envia o arquivo do target como asset.
Um arquivo esperado ausente gera um aviso e é ignorado; isso não encerra o comando com erro. Falhas ao criar releases ou enviar assets são registradas e podem não impedir a publicação npm. Portanto, a CI deve verificar por conta própria o conjunto completo de artefatos e o estado externo final.
napi pre-publish nunca publica o pacote raiz. No template gerado, ele roda em
prepublishOnly; quando termina com sucesso, a operação npm publish ao redor
dele publica o pacote raiz.
Estado exigido para a release
Antes de executar com credenciais reais, confirme todos os itens:
- A versão do
package.jsonraiz é final e nunca foi publicada. repositoryaponta para o repositório GitHub real. A proveniência npm valida a identidade do repositório e do workflow.napi.targetscontém exatamente os pacotes destinados a esta release.- As
optionalDependenciesexistentes foram revisadas. O comando adiciona ou atualiza targets configurados, mas não remove entradas de plataforma obsoletas. napi create-npm-dirscriou cada pacote de target.napi artifactscolocou cada binário esperado tanto no pacote do target quanto no workspace raiz.- Cada target passou em um teste de runtime no ambiente que declara suportar.
- O cliente npm configurado está autenticado para o pacote raiz e todos os pacotes de target.
GITHUB_TOKEN,GITHUB_REPOSITORYecontents: writeestão disponíveis quando releases GitHub estão habilitadas.- O workflow tem
id-token: writee a proveniência npm está habilitada quando se espera que a release inclua proveniência.
No workflow de pacote único gerado, use o estilo de tag npm:
{
"scripts": {
"prepublishOnly": "napi prepublish -t npm"
}
}
O estilo lerna padrão serve apenas para um commit de release do Lerna cujo
corpo liste a tag do pacote que será publicado.
Faça uma prévia com segurança
Execute diretamente o modo dry-run do comando:
DEBUG=napi:* yarn napi prepublish -t npm --dry-run
Isso confirma que a configuração e os metadados da release Git podem ser lidos, mas não verifica a presença dos binários nem testa a autorização do registry.
Para inspecionar o tarball npm sem disparar o script prepublishOnly real,
desabilite explicitamente os scripts de ciclo de vida:
npm pack --dry-run --ignore-scripts
DANGER
Não use npm publish --dry-run como substituto de segurança. O npm ainda pode
executar scripts de ciclo de vida, e um prepublishOnly contendo napi prepublish pode publicar os pacotes de plataforma com credenciais reais.
Falha parcial e recuperação
A release não é transacional. O npm não permite sobrescrever uma combinação de nome e versão publicada, e este comando não pode reverter pacotes já existentes.
Se uma execução falhar:
- Interrompa tentativas automáticas até saber quais pacotes e assets existem.
- Verifique cada target com
npm view <package>@<version> version, confira o pacote raiz separadamente e inspecione os assets da release no GitHub. - Mantenha os mesmos artefatos de build. Nunca publique bits diferentes sob uma versão que já exista para outro target.
- Execute novamente a mesma versão para publicar os targets ausentes. A CLI reconhece o erro padrão do npm para versões já publicadas e ignora esses pacotes; outros erros do registry ainda fazem a execução falhar.
- Passe
--gh-release-id <id>para reutilizar uma release GitHub existente ou--no-gh-releasese os assets forem gerenciados em outro lugar. - Use
--skip-optional-publishsomente depois de confirmar que todos os pacotes de plataforma existem. A opção não valida essa condição.
Se todos os pacotes de plataforma existirem, mas a publicação raiz falhar,
publique o tarball raiz inalterado a partir do job confiável com scripts de
ciclo de vida desabilitados, por exemplo npm publish --ignore-scripts --access public. Preserve a mesma configuração de proveniência. Se o pacote raiz já foi
publicado enquanto um pacote de plataforma está ausente, publique o pacote
faltante imediatamente ou descontinue a versão raiz quebrada; o npm não oferece
rollback atômico.
Consulte Publicar pacotes nativos para o runbook completo de CI.