Skip to content

feat(nuget): habilitar publicação dos 6 projetos netstandard como pacotes NuGet#81

Closed
rhfranzoni wants to merge 2 commits into
masterfrom
feat/nuget-standard-packages
Closed

feat(nuget): habilitar publicação dos 6 projetos netstandard como pacotes NuGet#81
rhfranzoni wants to merge 2 commits into
masterfrom
feat/nuget-standard-packages

Conversation

@rhfranzoni
Copy link
Copy Markdown

Sub-issue Fase 1 do épico nfe/dfetech-distribution-api#137 — rastreada por nfe/dfetech-distribution-api#138.

Sumário

Empacota os 6 projetos netstandard já existentes do fork (DFe.Classes, DFe.Utils, NFe.Classes, NFe.Servicos, NFe.Utils, NFe.Wsdl) como pacotes NuGet publicados no GitHub Packages (feed da org nfe). Habilita a Fase 2+3 (nfe/dfetech-distribution-api#139), onde os consumidores vão remover libs/DFe.NET/ embedded e usar PackageReference aos pacotes desta PR.

Descoberta da fase de investigação

A sub-issue ZeusAutomacao#138 partiu da premissa de que o fork precisaria de projetos .Standard.csproj adicionais (transplantados do libs/DFe.NET/ embedded). Não precisa: o fork já tem 6 csproj netstandard prontos. A migração para netstandard foi feita pelo upstream Zeus em commits anteriores, fazendo a Fase 1 muito mais simples:

Projeto TargetFramework Status
DFe.Classes netstandard1.3 ✅ Pronto
DFe.Utils netstandard2.0 ✅ Pronto
NFe.Classes netstandard2.0 ✅ Pronto
NFe.Servicos netstandard2.0 ✅ Pronto
NFe.Utils netstandard2.0 ✅ Pronto
NFe.Wsdl netstandard2.0 ✅ Pronto

Não há #if NETSTANDARD em nenhum arquivo .cs dos 6 — o código já é compatível por padrão.

CTe.* continua em v4.6.1 (Framework). Não cabe nesta PR — pode virar sub-issue separada se a empacotagem do CTe for necessária.

Mudanças

Directory.Build.props (novo, raiz)

Metadados NuGet compartilhados entre os 6 projetos:

  • Authors = NFE.io
  • Licença = LGPL-2.1-or-later (mesma do upstream Zeus)
  • RepositoryUrl, ProjectUrl apontando para este fork
  • IncludeSymbols=true + SymbolPackageFormat=snupkg para debug remoto
  • PackageReadmeFile referenciando README.md da raiz (mesmo arquivo em todos os pacotes)
  • EmbedUntrackedSources=true para SourceLink
  • Version default 1.0.0-local para builds locais; pipeline sobrescreve via -p:Version=

.csproj de cada projeto packável

Adicionado <PackageId> e <Description> em cada um. Prefixo NFEio.* evita colisão com nomes do upstream Zeus caso ambos sejam referenciados num mesmo consumidor durante a migração gradual:

.csproj PackageId
DFe.Classes/DFe.Classes.csproj NFEio.DFe.Classes
DFe.Utils/DFe.Utils.csproj NFEio.DFe.Utils
NFe.Classes/NFe.Classes.csproj NFEio.NFe.Classes
NFe.Servicos/NFe.Servicos.csproj NFEio.NFe.Servicos
NFe.Utils/NFe.Utils.csproj NFEio.NFe.Utils
NFe.Wsdl/NFe.Wsdl.csproj NFEio.NFe.Wsdl

.github/workflows/nuget-publish.yml (novo)

Workflow CI que dispara em:

  • push de tags v* — release versionada, extrai versão da tag (refs/tags/v1.0.01.0.0)
  • workflow_dispatch — execução manual com input opcional de versão, fallback 0.0.0-manual.{run_number}

Etapas:

  1. Setup .NET 8 SDK
  2. Resolve versão
  3. dotnet pack dos 6 projetos para ./artifacts/
  4. dotnet nuget push para https://nuget.pkg.github.com/nfe/index.json com auth via GITHUB_TOKEN
  5. Upload de artifacts no GitHub Actions (retenção 30 dias)

--skip-duplicate permite re-publicar mesma versão sem falha (útil para retries).

Smoke test local

Validado dotnet pack dos 6 projetos com -p:Version=1.0.0-smoke:

NFEio.DFe.Classes.1.0.0-smoke.nupkg + .snupkg
NFEio.DFe.Utils.1.0.0-smoke.nupkg + .snupkg
NFEio.NFe.Classes.1.0.0-smoke.nupkg + .snupkg
NFEio.NFe.Servicos.1.0.0-smoke.nupkg + .snupkg
NFEio.NFe.Utils.1.0.0-smoke.nupkg + .snupkg
NFEio.NFe.Wsdl.1.0.0-smoke.nupkg + .snupkg

Conferido .nuspec de NFEio.NFe.Servicos: dependências corretas para os 5 pacotes auxiliares no group .NETStandard2.0, metadados todos preenchidos (license, projectUrl, repository com commit SHA via SourceLink, README, tags).

Como rodar pós-merge

Local (sem publicar):

dotnet pack DFe.Classes/DFe.Classes.csproj -c Release -o ./artifacts -p:Version=1.0.0-test

CI release:

git tag v1.0.0
git push origin v1.0.0
# workflow dispara automaticamente, publica em GitHub Packages

CI manual:
GitHub Actions → Publish NuGet → Run workflow → input version=1.0.0-rc.1

Test plan

  • dotnet pack dos 6 projetos local (1.0.0-smoke)
  • .nuspec validado com dependências corretas
  • Build limpo (warnings pré-existentes só de vulnerabilidade conhecida em System.Security.Cryptography.Xml 4.4.0, não introduzida aqui)
  • Pós-merge: criar tag v1.0.0 no fork, workflow publica pacotes, smoke test em projeto consumidor isolado instalando NFEio.NFe.Servicos
  • Pós-publicação: prosseguir para nfe/dfetech-distribution-api#139 (Fase 2+3)

Bloqueia

  • nfe/dfetech-distribution-api#139 — pacotes precisam estar publicados antes da migração dos consumidores.

🤖 Generated with Claude Code

…otes NuGet

Sub-issue Fase 1 do epico nfe/dfetech-distribution-api#137 (ZeusAutomacao#138).

Empacota os 6 projetos netstandard ja existentes do fork como pacotes NuGet
publicados no GitHub Packages (feed da org nfe), eliminando a necessidade
de copia embedded libs/DFe.NET/ nos consumidores (Fase 2+3 em ZeusAutomacao#139).

Descoberta da fase de investigacao (ZeusAutomacao#138 comment): o fork ja tem 6 projetos
netstandard prontos (DFe.Classes netstandard1.3, DFe.Utils/NFe.Classes/
NFe.Servicos/NFe.Utils/NFe.Wsdl netstandard2.0) - nao precisa transplantar
Shared Projects nem criar .Standard.csproj adicionais. Basta adicionar
metadados de pacote e workflow de publicacao.

## Mudancas

### Directory.Build.props (raiz)
Metadados compartilhados entre todos os projetos packaveis: Authors=NFE.io,
licenca LGPL-2.1-or-later (mesma do upstream Zeus), URLs do repositorio,
IncludeSymbols=true + SymbolPackageFormat=snupkg para debug nos consumidores,
PackageReadmeFile apontando para README.md da raiz, EmbedUntrackedSources
para SourceLink. Version default 1.0.0-local para builds locais; pipeline
sobrescreve via -p:Version=.

### .csproj de cada projeto packavel
Adicionado <PackageId> e <Description> em:
- DFe.Classes/DFe.Classes.csproj            -> NFEio.DFe.Classes
- DFe.Utils/DFe.Utils.csproj                -> NFEio.DFe.Utils
- NFe.Classes/NFe.Classes.csproj            -> NFEio.NFe.Classes
- NFe.Servicos/NFe.Servicos.csproj          -> NFEio.NFe.Servicos
- NFe.Utils/NFe.Utils.csproj                -> NFEio.NFe.Utils
- NFe.Wsdl/NFe.Wsdl.csproj                  -> NFEio.NFe.Wsdl

Prefixo NFEio.* evita colisao com nomes do upstream Zeus caso ambos sejam
referenciados num mesmo consumidor durante a migracao gradual.

### .github/workflows/nuget-publish.yml
Workflow CI que dispara em push de tags v* (release) e workflow_dispatch
(testes manuais). Etapas:
1. Setup .NET 8 SDK
2. Resolve versao: tag (refs/tags/vX.Y.Z -> X.Y.Z), input manual, ou
   fallback 0.0.0-manual.{run_number}
3. dotnet pack dos 6 projetos -> ./artifacts/*.{nupkg,snupkg}
4. dotnet nuget push para https://nuget.pkg.github.com/nfe/index.json
   com auth via GITHUB_TOKEN (permissions: packages: write)
5. Upload de artifacts no Actions (retencao 30 dias)

skip-duplicate evita falha quando re-publicando mesma versao.

## Smoke test local

Validado dotnet pack dos 6 com -p:Version=1.0.0-smoke. Cada projeto gerou
.nupkg + .snupkg com metadados corretos: NFEio.NFe.Servicos.1.0.0-smoke.nupkg
declara dependencias para NFEio.DFe.Classes, NFEio.DFe.Utils, NFEio.NFe.Classes,
NFEio.NFe.Utils e NFEio.NFe.Wsdl no group .NETStandard2.0.

## Como rodar

Local (sem publicar):
    dotnet pack DFe.Classes/DFe.Classes.csproj -c Release -o ./artifacts -p:Version=1.0.0-test

CI release:
    git tag v1.0.0 && git push origin v1.0.0
    # workflow dispara automaticamente, publica em GitHub Packages

CI manual:
    GitHub Actions -> Publish NuGet -> Run workflow -> input version=1.0.0-rc.1

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings May 26, 2026 14:05
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Este PR habilita o empacotamento e a publicação no GitHub Packages dos 6 projetos netstandard já existentes no fork, preparando a migração de consumidores para PackageReference (em vez de libs/DFe.NET/ embedded).

Changes:

  • Adiciona Directory.Build.props na raiz com metadados NuGet compartilhados (authors/licença/URLs/tags/README/symbols).
  • Define PackageId e Description nos 6 .csproj packáveis, usando o prefixo NFEio.*.
  • Cria workflow GitHub Actions para dotnet pack e dotnet nuget push em tags v* e via workflow_dispatch.

Reviewed changes

Copilot reviewed 8 out of 8 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
Directory.Build.props Centraliza metadados NuGet e empacota o README.md da raiz para todos os pacotes.
DFe.Classes/DFe.Classes.csproj Define PackageId/Description do pacote NFEio.DFe.Classes.
DFe.Utils/DFe.Utils.csproj Define PackageId/Description do pacote NFEio.DFe.Utils.
NFe.Classes/NFe.Classes.csproj Define PackageId/Description do pacote NFEio.NFe.Classes.
NFe.Servicos/NFe.Servicos.csproj Define PackageId/Description do pacote NFEio.NFe.Servicos.
NFe.Utils/NFe.Utils.csproj Define PackageId/Description do pacote NFEio.NFe.Utils.
NFe.Wsdl/NFe.Wsdl.csproj Define PackageId/Description do pacote NFEio.NFe.Wsdl.
.github/workflows/nuget-publish.yml Pipeline de pack/publish para GitHub Packages com versão derivada de tag/dispatch.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread .github/workflows/nuget-publish.yml
…kages

Address review comment do copilot-pull-request-reviewer no PR #81
(linha 80 do nuget-publish.yml):

> Directory.Build.props habilita IncludeSymbols=true com SymbolPackageFormat
> =snupkg, mas o workflow so faz push de ./artifacts/*.nupkg. Isso deixa os
> .snupkg sem publicacao no feed, entao consumidores nao vao conseguir baixar
> PDBs/symbols (debugging/SourceLink) via NuGet.

Adicionado um segundo passo de `dotnet nuget push` para `*.snupkg`. O glob
`*.nupkg` do passo anterior nao captura os symbol packages, e tentar fazer
push de ambos num so glob (`*.{nupkg,snupkg}` com brace expansion) gera
ambiguidade dependendo do shell. Dois passos explicitos sao mais robustos.

GitHub Packages suporta .snupkg desde 2020 (referencia: docs.github.com/
packages/working-with-a-github-packages-registry/working-with-the-nuget-registry).
--skip-duplicate evita falha em re-publicacao da mesma versao.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@rhfranzoni rhfranzoni assigned rhfranzoni and unassigned rhfranzoni May 26, 2026
@rhfranzoni rhfranzoni requested a review from john182 May 26, 2026 18:25
@rhfranzoni
Copy link
Copy Markdown
Author

Pivot — fechando como obsoleto

Em 2026-05-26 pivotamos a estratégia: em vez de manter o fork nfe/DFe.NET e publicar pacotes próprios, migramos para os pacotes oficiais Zeus.Net.NFe.NFCe + Zeus.Net.CTe (v2026.5.20.1650) do projeto upstream Zeus.Net.

Motivação

  • Zeus.Net já publica netstandard2.0 + net6.0 (multi-target), cobrindo o caso de uso do dfetech-distribution-api.
  • Evita manutenção de fork + pipeline próprio.
  • Reduz drift entre nossa base e o upstream.

Substituição

A migração foi implementada em https://github.com/nfe/dfetech-distribution-api/pull/143 — substitui o libs/DFe.NET/ embedded por PackageReferences aos pacotes Zeus.Net oficiais.

Status do PR

Os 6 commits desta branch (feat/nuget-standard-packages) tornaram-se desnecessários. Fechando sem merge.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants