From 341e7e211d2d330c2ae502bfc38b6059db3c5d61 Mon Sep 17 00:00:00 2001 From: rhfranzoni Date: Tue, 26 May 2026 11:04:20 -0300 Subject: [PATCH 1/2] feat(nuget): habilitar publicacao dos 6 projetos netstandard como pacotes NuGet Sub-issue Fase 1 do epico nfe/dfetech-distribution-api#137 (#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 #139). Descoberta da fase de investigacao (#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 e 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) --- .github/workflows/nuget-publish.yml | 87 +++++++++++++++++++++++++++++ DFe.Classes/DFe.Classes.csproj | 2 + DFe.Utils/DFe.Utils.csproj | 2 + Directory.Build.props | 41 ++++++++++++++ NFe.Classes/NFe.Classes.csproj | 2 + NFe.Servicos/NFe.Servicos.csproj | 2 + NFe.Utils/NFe.Utils.csproj | 2 + NFe.Wsdl/NFe.Wsdl.csproj | 2 + 8 files changed, 140 insertions(+) create mode 100644 .github/workflows/nuget-publish.yml create mode 100644 Directory.Build.props diff --git a/.github/workflows/nuget-publish.yml b/.github/workflows/nuget-publish.yml new file mode 100644 index 000000000..2b9966ac7 --- /dev/null +++ b/.github/workflows/nuget-publish.yml @@ -0,0 +1,87 @@ +name: Publish NuGet + +# Empacota e publica os 6 projetos NFe/DFe netstandard como pacotes NuGet +# em GitHub Packages (feed da org nfe). +# +# Triggers: +# - push de tag v* → release versionada (pega a versão da tag) +# - workflow_dispatch → execução manual para testes (versão informada +# como input ou fallback 0.0.0-manual.{run_number}) +# +# Pré-requisitos no consumidor: +# 1. nuget.config com source apontando para https://nuget.pkg.github.com/nfe/index.json +# 2. PAT com escopo read:packages adicionado como secret/login NuGet +# +# Pacotes publicados: NFEio.DFe.Classes, NFEio.DFe.Utils, NFEio.NFe.Classes, +# NFEio.NFe.Servicos, NFEio.NFe.Utils, NFEio.NFe.Wsdl. + +on: + push: + tags: + - 'v*' + workflow_dispatch: + inputs: + version: + description: 'Versão a publicar (ex: 1.0.0-rc.1). Vazio = 0.0.0-manual.{run_number}' + required: false + type: string + +permissions: + contents: read + packages: write + +jobs: + pack-and-publish: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup .NET + uses: actions/setup-dotnet@v4 + with: + dotnet-version: '8.0.x' + + - name: Resolve version + id: version + run: | + if [[ "${{ github.event_name }}" == "push" ]]; then + # tag refs/tags/vX.Y.Z → X.Y.Z + VERSION="${GITHUB_REF_NAME#v}" + elif [[ -n "${{ inputs.version }}" ]]; then + VERSION="${{ inputs.version }}" + else + VERSION="0.0.0-manual.${{ github.run_number }}" + fi + echo "version=$VERSION" >> "$GITHUB_OUTPUT" + echo "Resolved version: $VERSION" + + - name: Pack projects + run: | + for proj in DFe.Classes DFe.Utils NFe.Classes NFe.Servicos NFe.Utils NFe.Wsdl; do + echo "::group::Pack $proj" + dotnet pack "$proj/$proj.csproj" \ + --configuration Release \ + --output ./artifacts \ + -p:Version=${{ steps.version.outputs.version }} + echo "::endgroup::" + done + + - name: List artifacts + run: ls -la ./artifacts + + - name: Push to GitHub Packages + run: | + dotnet nuget push './artifacts/*.nupkg' \ + --source https://nuget.pkg.github.com/nfe/index.json \ + --api-key ${{ secrets.GITHUB_TOKEN }} \ + --skip-duplicate + + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + name: nuget-packages-${{ steps.version.outputs.version }} + path: ./artifacts/*.*nupkg + retention-days: 30 diff --git a/DFe.Classes/DFe.Classes.csproj b/DFe.Classes/DFe.Classes.csproj index 1428fa849..44d4808b2 100644 --- a/DFe.Classes/DFe.Classes.csproj +++ b/DFe.Classes/DFe.Classes.csproj @@ -6,6 +6,8 @@ DFe.Classes DFe.Classes false + NFEio.DFe.Classes + Classes compartilhadas entre os projetos DFe (NFe, NFCe, CTe, MDFe) do fork NFE.io de Zeus.Net.NFe.NFCe. Inclui tipos básicos, entidades de domínio e flags. diff --git a/DFe.Utils/DFe.Utils.csproj b/DFe.Utils/DFe.Utils.csproj index 1bccc523c..6d25a94b0 100644 --- a/DFe.Utils/DFe.Utils.csproj +++ b/DFe.Utils/DFe.Utils.csproj @@ -6,6 +6,8 @@ DFe.Utils DFe.Utils false + NFEio.DFe.Utils + Utilitários compartilhados entre os projetos DFe (NFe, NFCe, CTe, MDFe) do fork NFE.io de Zeus.Net.NFe.NFCe. Inclui assinatura digital, extensões de tipos e helpers de serialização XML. diff --git a/Directory.Build.props b/Directory.Build.props new file mode 100644 index 000000000..c2a64e93a --- /dev/null +++ b/Directory.Build.props @@ -0,0 +1,41 @@ + + + + + 1.0.0-local + NFE.io + NFE.io + Copyright (c) NFE.io e contribuidores Zeus (Zeusdev Tecnologia LTDA) + LGPL-2.1-or-later + https://github.com/nfe/DFe.NET + https://github.com/nfe/DFe.NET + git + nfe;nfce;sefaz;dfe;rtc;reforma-tributaria;nfeio + true + snupkg + true + true + README.md + + + + + + + + diff --git a/NFe.Classes/NFe.Classes.csproj b/NFe.Classes/NFe.Classes.csproj index d35ab7e2c..9b2b30307 100644 --- a/NFe.Classes/NFe.Classes.csproj +++ b/NFe.Classes/NFe.Classes.csproj @@ -6,6 +6,8 @@ NFe.Classes NFe.Classes false + NFEio.NFe.Classes + Classes de domínio para Nota Fiscal Eletrônica (NFe) e Nota Fiscal de Consumidor Eletrônica (NFCe) — fork NFE.io de Zeus.Net.NFe.NFCe. Inclui leiaute completo NFe v4.00, eventos da NT 2025.002-RTC (211110-150, 212110-120, 412120-130, 110001), tipos do IBS/CBS/IS, e classes de DistribuicaoDFe. diff --git a/NFe.Servicos/NFe.Servicos.csproj b/NFe.Servicos/NFe.Servicos.csproj index 2ffce9355..55df134cf 100644 --- a/NFe.Servicos/NFe.Servicos.csproj +++ b/NFe.Servicos/NFe.Servicos.csproj @@ -5,6 +5,8 @@ NFe.Servicos NFe.Servicos false + NFEio.NFe.Servicos + Camada de serviços para invocar webservices SEFAZ da NFe/NFCe — fork NFE.io de Zeus.Net.NFe.NFCe. Expõe ServicosNFe com métodos RecepcaoEvento para os 17 eventos da NT 2025.002-RTC (Crédito Presumido, Imobilização, Consumo Pessoal, Manifestações IBS/CBS de Sucessão, etc.), além dos eventos legacy (Manifestação Destinatário 21020X, Carta de Correção, Cancelamento). diff --git a/NFe.Utils/NFe.Utils.csproj b/NFe.Utils/NFe.Utils.csproj index e3c97646b..f840e7500 100644 --- a/NFe.Utils/NFe.Utils.csproj +++ b/NFe.Utils/NFe.Utils.csproj @@ -6,6 +6,8 @@ NFe.Utils NFe.Utils false + NFEio.NFe.Utils + Utilitários para o leiaute da NFe/NFCe — fork NFE.io de Zeus.Net.NFe.NFCe. Inclui Validador (com mappings XSD da NT 2025.002-RTC), Enderecador (URLs SVRS prod/hom), assinatura digital, conversões de tipos e extensões. diff --git a/NFe.Wsdl/NFe.Wsdl.csproj b/NFe.Wsdl/NFe.Wsdl.csproj index 3aa764c0c..498415490 100644 --- a/NFe.Wsdl/NFe.Wsdl.csproj +++ b/NFe.Wsdl/NFe.Wsdl.csproj @@ -5,6 +5,8 @@ NFe.Wsdl NFe.Wsdl false + NFEio.NFe.Wsdl + Contratos WSDL e clientes SOAP para os webservices da NFe/NFCe — fork NFE.io de Zeus.Net.NFe.NFCe. Cobre NfeAutorizacao4, NfeRetAutorizacao4, NfeStatusServico4, NfeConsultaProtocolo4, NfeConsultaCadastro4, NFeRecepcaoEvento4, NFeInutilizacao4, NFeDistribuicaoDFe e variantes estaduais. From b1e839139b6e907e81b563d04c3de794326621fc Mon Sep 17 00:00:00 2001 From: rhfranzoni Date: Tue, 26 May 2026 13:15:25 -0300 Subject: [PATCH 2/2] ci(nuget): publicar tambem os .snupkg (symbol packages) no GitHub Packages Address review comment do copilot-pull-request-reviewer no PR nfe/DFe.NET#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) --- .github/workflows/nuget-publish.yml | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/.github/workflows/nuget-publish.yml b/.github/workflows/nuget-publish.yml index 2b9966ac7..cd08a6e4e 100644 --- a/.github/workflows/nuget-publish.yml +++ b/.github/workflows/nuget-publish.yml @@ -72,13 +72,25 @@ jobs: - name: List artifacts run: ls -la ./artifacts - - name: Push to GitHub Packages + - name: Push packages (.nupkg) to GitHub Packages run: | dotnet nuget push './artifacts/*.nupkg' \ --source https://nuget.pkg.github.com/nfe/index.json \ --api-key ${{ secrets.GITHUB_TOKEN }} \ --skip-duplicate + # Symbol packages (.snupkg) precisam de push separado — o glob *.nupkg + # acima não os captura, e o Directory.Build.props declara IncludeSymbols + # com SymbolPackageFormat=snupkg. Sem este passo os consumidores não + # conseguem PDBs nem SourceLink (debugging quebrado). GitHub Packages + # suporta .snupkg desde 2020. + - name: Push symbol packages (.snupkg) to GitHub Packages + run: | + dotnet nuget push './artifacts/*.snupkg' \ + --source https://nuget.pkg.github.com/nfe/index.json \ + --api-key ${{ secrets.GITHUB_TOKEN }} \ + --skip-duplicate + - name: Upload artifacts uses: actions/upload-artifact@v4 with: