No nuget.org, o campo Signing Owner ... (0 certificates) indica que o proprietário ainda não configurou certificado para Author signing. Isso não bloqueia publicação, mas melhora confiança e rastreabilidade para consumidores quando você assina.
Formas de melhorar:
- Ativar assinatura do pacote no build (
dotnet nuget sign) usando um certificado de code signing (PFX) emitido por uma CA confiável. - Usar um provedor de assinatura em nuvem (Azure Key Vault, DigiCert KeyLocker, etc.) para evitar armazenar PFX localmente.
- Publicar com pipeline que assina antes do
nuget pushe validar assinatura comnuget verify -signatures.
Exemplo local (Windows) após dotnet pack:
dotnet nuget sign ./artifacts/DbSqlLikeMem.*.nupkg \
--certificate-path "./certs/codesign.pfx" \
--certificate-password "<PASSWORD>" \
--timestamper "http://timestamp.digicert.com"
nuget verify -Signatures ./artifacts/DbSqlLikeMem.*.nupkgDica: use timestamp RFC3161 para a assinatura continuar válida mesmo após expiração do certificado.
Para projetos open source, outra alternativa é habilitar proveniência de repositório (SourceLink + pipeline protegida + políticas de release), mesmo quando author-signing ainda não estiver disponível.
Implementação atual deste repositório:
src/code/Directory.Build.propspublica metadados de repositório no pacote, habilita build determinístico em CI e gerasnupkgpara depuração..github/workflows/nuget-publish.ymlvalida metadados dos.nupkgviascripts/check_nuget_package_metadata.pyantes dopush, usandosrc/code/Directory.Build.propscomo fonte de verdade para compararversion,authors,repository,projectUrl,readme,tags,releaseNotes, licença erequireLicenseAcceptance.- A versão do release NuGet sai de
src/code/Directory.Build.props; a tag operacional deve seguirv<versao>e permanecer em SemVer compatível com esse arquivo. - O workflow também valida explicitamente a presença dessa fonte de versão antes do
pack, prendendo o contratotag v* -> src/code/Directory.Build.props -> .nupkg. - O mesmo workflow agora executa
python scripts/check_release_readiness.pyantes dorestore, trazendo o gate documental/operacional para o ponto exato do publish NuGet.
- Crie uma API key em https://www.nuget.org/ (Account settings → API Keys).
- No repositório do GitHub, adicione o secret
NUGET_API_KEYno Environmentnuget-publish. Se precisar variar o Environment sem editar o workflow, definavars.NUGET_PUBLISH_ENVIRONMENT; o fallback continua sendonuget-publish. - Atualize a versão em
src/code/Directory.Build.props(Version). - Crie e envie uma tag de release:
git tag v0.1.0
git push origin v0.1.0Use a regra abaixo antes de publicar no NuGet:
- PATCH (
1.4.x): apenas correções de bug, melhorias internas e ajustes de testes/documentação sem ampliar comportamento público. - MINOR (
1.x.0): novas features compatíveis (novas capacidades SQL, novos cenários suportados, novas integrações) sem quebrar APIs/contratos existentes. - MAJOR (
x.0.0): qualquer breaking change em API pública, comportamento padrão incompatível ou remoção/alteração de contrato esperado.
Checklist rápido para confirmar breaking change:
- Houve remoção/renomeação de tipos, métodos, propriedades ou parâmetros públicos?
- Algum comportamento padrão passou a lançar exceção onde antes era suportado?
- Algum fluxo compatível de versão anterior exige mudança obrigatória no código consumidor?
Se todas as respostas forem não, prefira PATCH (sem feature nova) ou MINOR (com feature nova).
python3 scripts/check_release_readiness.py também passa a validar o formato SemVer das versões configuradas no núcleo (src/code/Directory.Build.props) e nas extensões (package.json do VS Code e source.extension.vsixmanifest do VSIX), sem impor que todos compartilhem o mesmo número.
O mesmo auditor também imprime uma sugestão de impacto SemVer baseada nas notas de CHANGELOG.md em ## [Unreleased], ajudando a padronizar a triagem entre PATCH, MINOR e MAJOR.
O mesmo auditor agora cobre contratos mínimos de publicação das extensões: scripts/arquivos essenciais do pacote VS Code, activation events apontando para comandos/views existentes e presença do overview/tags/categorias no manifesto de publicação VSIX.
No caso da VSIX, a auditoria também verifica alinhamento entre MinimumVisualStudioVersion do projeto e o range suportado no source.extension.vsixmanifest, evitando drift de compatibilidade declarada.
Para a extensão VS Code, a mesma trilha também valida placeholders %...% do package.json contra package.nls*.json e a presença da pasta l10n.
Antes de publicar:
- Atualize a versão em
src/code/Directory.Build.props. - Revise
CHANGELOG.mdcom impacto por provider/dialeto e limitações ainda abertas. - Confirme que
docs/features-backlog/index.mdreflete os percentuais e incrementos entregues. - Registre o andamento operacional em
docs/features-backlog/status-operational.mdquando houver contexto de sprint ainda relevante. - Refaça os snapshots cross-dialect aplicáveis (
smoke,aggregation,parser,strategy) viascripts/refresh_cross_dialect_snapshots.sh. - Valide que workflows de publicação/CI e documentação apontam para os artefatos corretos.
- Verifique se alguma limitação conhecida precisa ficar explícita na release.
- Rode
python3 scripts/check_release_readiness.pypara auditar documentação, workflows, snapshots e metadados de publicação antes de empacotar. - Depois do
pack, rodepython3 scripts/check_nuget_package_metadata.py --artifacts-dir ./artifactspara auditar os.nupkgque serão publicados. - Confirme que
CHANGELOG.mdcontinua com## [Unreleased], subseções de impacto eKnown limitations still openantes de criar qualquer tag de release.
Workflow responsável:
.github/workflows/nuget-publish.yml
Esse pipeline empacota e publica os projetos do solution no nuget.org.
O pacote DbSqlLikeMem.VisualStudioExtension.*.nupkg é ignorado nesse workflow, pois a extensão Visual Studio é publicada separadamente pelo fluxo de VSIX.
Observação: o workflow usa
secrets.NUGET_API_KEYdo Environment resolvido porvars.NUGET_PUBLISH_ENVIRONMENTou, na ausência dela, do fallbacknuget-publish.
dotnet pack src/DbSqlLikeMem.slnx -c Release -o ./artifacts
# publica somente pacotes NuGet da biblioteca (exclui o pacote da extensão VS)
for p in ./artifacts/*.nupkg; do
case "$(basename "$p")" in
DbSqlLikeMem.VisualStudioExtension.*.nupkg) continue ;;
esac
dotnet nuget push "$p" --api-key "<SUA_API_KEY>" --source "https://api.nuget.org/v3/index.json" --skip-duplicate
doneWorkflow preparado:
.github/workflows/vsix-publish.yml- O workflow executa
python scripts/check_release_readiness.pyantes do build e usa--strict-marketplace-placeholdersao publicar, bloqueando publish compublisherplaceholder. - A versão operacional da VSIX sai de
src/extensions/DbSqlLikeMem.VisualStudioExtension/source.extension.vsixmanifest; a tag automática deve seguirvsix-v<versao-da-vsix>. - O workflow também valida explicitamente essa origem antes do build, prendendo o contrato
tag vsix-v* -> source.extension.vsixmanifest -> publish.
- Criar PAT para publicação no Visual Studio Marketplace.
- Salvar no GitHub como secret
VS_MARKETPLACE_TOKEN. - Confirmar os campos operacionais finais em
eng/visualstudio/PublishManifest.json, principalmentepublisher. - Garantir que exista um projeto VSIX (workflow usa
src/extensions/DbSqlLikeMem.VisualStudioExtension/DbSqlLikeMem.VisualStudioExtension.csproj).
O campo
repodo manifesto já aponta para o repositório oficial; opublisherainda deve ser confirmado antes da publicação final.
- Manual (recomendado para validação):
- Execute o workflow Publish Visual Studio Extension (VSIX) via
workflow_dispatch. - Defina
publish = truepara publicar.
- Execute o workflow Publish Visual Studio Extension (VSIX) via
- Automático por tag:
- Use tags no formato
vsix-v*(ex.:vsix-v1.0.0).
- Use tags no formato
A extensão em src/extensions/DbSqlLikeMem.VsCodeExtension está preparada para empacotamento/publicação.
- Workflow:
.github/workflows/vscode-extension-publish.yml - O workflow valida explicitamente
src/extensions/DbSqlLikeMem.VsCodeExtension/package.jsonantes de empacotar, prendendo o contratotag vscode-v* -> package.json -> publish. - Secret necessário:
VSCE_PAT - Tag para publicação automática:
vscode-v* - O workflow executa
python3 scripts/check_release_readiness.pyantes de instalar dependências/empacotar. - A versão operacional da extensão sai de
src/extensions/DbSqlLikeMem.VsCodeExtension/package.json; a tag automática deve seguirvscode-v<versao-da-extensao>.
As URLs de repositório/bugs/homepage do package.json já foram alinhadas ao repositório oficial; mantenha a revisão do publisher e use python3 scripts/check_release_readiness.py como auditoria final de readiness.
- NuGet: versão em
src/code/Directory.Build.propse tagv<versao>. - VSIX: versão em
src/extensions/DbSqlLikeMem.VisualStudioExtension/source.extension.vsixmanifeste tagvsix-v<versao-da-vsix>. - VS Code: versão em
src/extensions/DbSqlLikeMem.VsCodeExtension/package.jsone tagvscode-v<versao-da-extensao>. - Os três fluxos exigem SemVer válido, mas não precisam compartilhar exatamente o mesmo número de versão.
cd src/extensions/DbSqlLikeMem.VsCodeExtension
npm install
npm run compile
npm run package
# ou publicação direta
npm run publishAntes de publicar, confirme o
publisherfinal e rodepython3 scripts/check_release_readiness.py.