Publicação de Pacotes .NET 8 no NuGet Usando VSCode e CLI

Publicar bibliotecas no NuGet.org é uma excelente forma de compartilhar código reutilizável com a comunidade ou entre times internos.
Com o .NET 8, o processo ficou ainda mais simples e pode ser feito inteiramente pelo terminal (CLI) ou VSCode, sem depender do Visual Studio completo.

Sumário

  1. Introdução ao NuGet
  2. Criação de Conta e API Key
  3. Estrutura do Projeto e Preparação do .csproj
  4. Gerando o Pacote com dotnet pack
  5. Publicando com dotnet nuget push
  6. Configuração Local (nuget.config)
  7. Boas Práticas e Dicas de Segurança
  8. Cenários Avançados e Automação CI/CD
  9. Referências

Introdução ao NuGet

NuGet é o gerenciador de pacotes oficial do ecossistema .NET. Ele permite empacotar e distribuir bibliotecas (.dlls) com metadados descritivos, versões e dependências.

Os pacotes são publicados no NuGet.org (repositório público) ou em feeds privados (como Azure Artifacts, GitHub Packages ou repositórios internos).

Criação de Conta e API Key

Criar conta

Gerar a API Key

  • Vá em Your Account → API Keys → + Create
  • Configure:
    • Key name: nome descritivo (ex: mfa-shield-publish)
    • Expiration: 1 ano (ou menos)
    • Scope: “Push new packages and package versions”
    • Glob pattern* (ou MyCompany.* se quiser restringir)
  • Clique em Create e copie a API Key (mostrada apenas uma vez).

⚠️ Guarde em local seguro!
Não versionar ou compartilhar a chave. Use variáveis de ambiente ou GitHub Secrets.

Estrutura do Projeto e Preparação do .csproj

Certifique-se de que sua biblioteca segue uma estrutura clara, por exemplo:

/src
  /MyLibrary
    MyLibrary.csproj
    /Models
    /Services
/tests
  /MyLibrary.Tests

Exemplo de .csproj completo para NuGet:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
    <GeneratePackageOnBuild>false</GeneratePackageOnBuild>
    <Version>1.0.0</Version>
    <Authors>Eryx Guimarães</Authors>
    <Company>EryxGuimaraes</Company>
    <Description>Biblioteca de autenticação MFA modular para .NET 8</Description>
    <PackageId>MfaShield</PackageId>
    <PackageTags>security;authentication;mfa;totp</PackageTags>
    <RepositoryUrl>https://github.com/eryxguimaraes/MfaShield</RepositoryUrl>
    <PackageProjectUrl>https://github.com/eryxguimaraes/MfaShield</PackageProjectUrl>
    <PackageLicenseExpression>MIT</PackageLicenseExpression>
    <PackageReadmeFile>README.md</PackageReadmeFile>
    <IncludeSymbols>true</IncludeSymbols>
    <SymbolPackageFormat>snupkg</SymbolPackageFormat>
  </PropertyGroup>

  <ItemGroup>
    <None Include="README.md" Pack="true" PackagePath="" />
  </ItemGroup>

</Project>

Dica: Sempre inclua README.mdLICENSE, e defina PackageId de forma única (ex: CompanyName.LibraryName).

Gerando o Pacote com dotnet pack

No terminal (VSCode integrado ou PowerShell):

dotnet pack -c Release

Isso gera um arquivo .nupkg dentro da pasta:

bin/Release/MfaShield.1.0.0.nupkg

Para confirmar o conteúdo:

nuget list *.nupkg

Ou inspecione diretamente:

dotnet nuget locals global-packages --list

Publicando com dotnet nuget push

Método 1 – Linha direta com chave:

dotnet nuget push "bin/Release/MfaShield.1.0.0.nupkg" \
    --api-key YOUR_API_KEY \
    --source https://api.nuget.org/v3/index.json

Método 2 – Via configuração local (nuget.config)

Crie o arquivo ~/.nuget/NuGet/NuGet.Config (ou no projeto):

<configuration>
  <packageSources>
    <add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
  </packageSources>
  <apikeys>
    <add key="https://api.nuget.org/v3/index.json" value="YOUR_API_KEY" />
  </apikeys>
</configuration>

Agora basta:

dotnet nuget push "bin/Release/MfaShield.1.0.0.nupkg" --source nuget.org

Configuração Local (nuget.config)

Para projetos corporativos ou com múltiplos feeds:

<configuration>
  <packageSources>
    <add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
    <add key="azure-artifacts" value="https://pkgs.dev.azure.com/contoso/_packaging/private-feed/nuget/v3/index.json" />
  </packageSources>
  <packageSourceCredentials>
    <azure-artifacts>
      <add key="Username" value="username" />
      <add key="ClearTextPassword" value="PAT_OR_TOKEN" />
    </azure-artifacts>
  </packageSourceCredentials>
</configuration>

Use o nuget.config na raiz da solução quando quiser compartilhar a configuração com outros desenvolvedores.

Boas Práticas e Dicas de Segurança

Boas práticasExplicação
Versionamento semânticoUse MAJOR.MINOR.PATCH (ex: 1.0.0 → 1.1.0 → 2.0.0)
README e LICENSE inclusosReforçam confiabilidade e documentação pública
Pacotes assinadosUse certificados de assinatura com nuget sign
Evite expor a API keyPrefira variáveis de ambiente (NUGET_API_KEY)
Automatize via CI/CDUse GitHub Actions, Azure DevOps ou GitLab
Use snupkg para debug symbolsFacilita depuração no Visual Studio
Prefixe pacotes internosEx: CompanyName.* para distinguir do público

Cenários Avançados e Automação CI/CD

Publicação automática via GitHub Actions

name: Publish to NuGet
on:
  release:
    types: [published]

jobs:
  publish:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Setup .NET
        uses: actions/setup-dotnet@v4
        with:
          dotnet-version: '8.0.x'
      - name: Build and Pack
        run: dotnet pack -c Release
      - name: Publish to NuGet
        run: dotnet nuget push "src/**/bin/Release/*.nupkg" --api-key ${{ secrets.NUGET_API_KEY }} --source https://api.nuget.org/v3/index.json

Adicione NUGET_API_KEY nos Secrets do repositório GitHub.

Referências

Conclusão

Com o .NET 8 e o CLI unificado, publicar pacotes no NuGet ficou mais direto e seguro.
Usar o VSCode e pipelines automatizadas permite escalar a distribuição de bibliotecas com qualidade e controle, seja para open source ou ambientes corporativos.