<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Gabriel Batista</title>
    <description>The latest articles on DEV Community by Gabriel Batista (@devgabrielb).</description>
    <link>https://dev.to/devgabrielb</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F584610%2Ff0086b1e-58c2-4fb3-bf72-b2c5ea0b4337.png</url>
      <title>DEV Community: Gabriel Batista</title>
      <link>https://dev.to/devgabrielb</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/devgabrielb"/>
    <language>en</language>
    <item>
      <title>Como Resolver o Erro DbUpdateConcurrencyException no Entity Framework</title>
      <dc:creator>Gabriel Batista</dc:creator>
      <pubDate>Fri, 03 Jan 2025 05:38:52 +0000</pubDate>
      <link>https://dev.to/devgabrielb/como-resolver-o-erro-dbupdateconcurrencyexception-no-entity-framework-392k</link>
      <guid>https://dev.to/devgabrielb/como-resolver-o-erro-dbupdateconcurrencyexception-no-entity-framework-392k</guid>
      <description>&lt;p&gt;&lt;strong&gt;Se você estiver gerando seus próprios IDs ao usar Entity Framework e se deparar com um erro de concorrência, essa dica pode te ajudar!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Recentemente, enfrentei um problema interessante ao trabalhar com Entity Framework: um &lt;strong&gt;DbUpdateConcurrencyException&lt;/strong&gt; aparentemente inexplicável ao tentar salvar novas entidades.&lt;/p&gt;

&lt;p&gt;A funcionalidade era simples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Recuperar um Grupo do banco&lt;/li&gt;
&lt;li&gt;Adicionar um Membro ao Grupo&lt;/li&gt;
&lt;li&gt;Salvar tudo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O código parecia correto, mas sempre recebia:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;DbUpdateConcurrencyException: The database operation was expected to affect 1 row&lt;span class="o"&gt;(&lt;/span&gt;s&lt;span class="o"&gt;)&lt;/span&gt;, but actually affected 0 row&lt;span class="o"&gt;(&lt;/span&gt;s&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;O que acontece?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Esse erro ocorre porque, por padrão, o Entity Framework assume a responsabilidade de gerar e gerenciar os valores das chaves primárias das entidades. Quando você define manualmente um valor para uma chave que normalmente seria gerada, a entidade será rastreada como "&lt;strong&gt;Modified&lt;/strong&gt;" em vez de "&lt;strong&gt;Added&lt;/strong&gt;" e quando uma entidade é marcada como "&lt;strong&gt;Modified&lt;/strong&gt;" em vez de "&lt;strong&gt;Added&lt;/strong&gt;", o EF tenta fazer um &lt;strong&gt;UPDATE&lt;/strong&gt; no banco em vez de um &lt;strong&gt;INSERT&lt;/strong&gt; mas não existe registro para atualizar (é uma nova entidade)&lt;/p&gt;

&lt;p&gt;Esse erro ocorre porque, por padrão, o Entity Framework assume a responsabilidade de gerar e gerenciar os valores das chaves primárias das entidades. Quando você define manualmente um valor para uma chave que normalmente seria gerada, a entidade é rastreada como "Modified" em vez de "&lt;strong&gt;Added&lt;/strong&gt;". Como resultado, o EF  tenta realizar um &lt;strong&gt;UPDATE&lt;/strong&gt; no banco de dados em vez de um &lt;strong&gt;INSERT&lt;/strong&gt;, mas não existe nenhum registro para atualizar (é uma nova entidade).&lt;/p&gt;

&lt;p&gt;A solução? Configure explicitamente que a chave primária não deve ser gerada automaticamente. Isso pode ser feito no &lt;strong&gt;Fluent API:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Property&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;ValueGeneratedNever&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ou com &lt;strong&gt;data annotations&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;DatabaseGenerated&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DatabaseGeneratedOption&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Espero que essa dica ajude você a evitar horas de debugging! 😉&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>ef</category>
      <category>entityframeworkcore</category>
      <category>csharp</category>
    </item>
    <item>
      <title>Seu Primeiro Pacote NuGet: Um Passo a Passo Prático</title>
      <dc:creator>Gabriel Batista</dc:creator>
      <pubDate>Fri, 03 Jan 2025 05:33:35 +0000</pubDate>
      <link>https://dev.to/devgabrielb/seu-primeiro-pacote-nuget-um-passo-a-passo-pratico-1o4n</link>
      <guid>https://dev.to/devgabrielb/seu-primeiro-pacote-nuget-um-passo-a-passo-pratico-1o4n</guid>
      <description>&lt;p&gt;Quando você trabalha em diferentes aplicações, é comum se deparar com os mesmos problemas e as mesmas soluções aparecendo de novo e de novo. Isso faz parte do dia a dia de um desenvolvedor, mas pode ser meio cansativo. Agora, imagine se você pudesse pegar esse código repetido, organizar direitinho e usar facilmente em outros projetos. Legal, né? Neste artigo, vamos explorar como fazer isso com o NuGet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Visão geral:
&lt;/h2&gt;

&lt;p&gt;O NuGet é o gerenciador de pacotes oficial do .NET e ajuda você a empacotar, compartilhar e usar funcionalidades reutilizáveis de forma simples. Com ele, dá para organizar seu código em pacotes, reaproveitá-los em outros projetos e até colaborar de maneira mais prática com outros desenvolvedores.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;"Um pacote NuGet é um arquivo ZIP com a extensão .nupkg que contém código compilado (DLLs), arquivos relacionados e um manifesto descritivo com informações como o número da versão. Desenvolvedores criam e publicam pacotes, enquanto consumidores obtêm e utilizam suas funcionalidades. O NuGet gerencia os detalhes intermediários."&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Criando um projeto
&lt;/h2&gt;

&lt;p&gt;Antes de começar, crie uma conta no &lt;a href="https://www.nuget.org/" rel="noopener noreferrer"&gt;NuGet.org&lt;/a&gt;. Isso será necessário para publicar seu pacote.&lt;/p&gt;

&lt;p&gt;Crie um projeto do tipo &lt;strong&gt;Class Library&lt;/strong&gt;. No terminal, execute:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;dotnet&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;classlib&lt;/span&gt; &lt;span class="p"&gt;--&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="n"&gt;ExamplePackage&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Em seguida, abra o projeto em seu editor de preferência. Vamos criar um exemplo simples que converte um objeto em uma string JSON.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7y48cfl467arr7olqu5b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7y48cfl467arr7olqu5b.png" alt="Código do pacote" width="590" height="310"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Definindo os Metadados
&lt;/h2&gt;

&lt;p&gt;Para criar um pacote, é necessário configurar informações importantes diretamente no arquivo .&lt;strong&gt;csproj&lt;/strong&gt; do projeto. Esse arquivo define os metadados essenciais que identificarão seu pacote no NuGet.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Metadados Obrigatórios:&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;TargetFramework&lt;/strong&gt;: Define a versão do .NET que seu projeto utilizará.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PackageId&lt;/strong&gt;: Um identificador único para seu pacote.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Version&lt;/strong&gt;: Versão do pacote no formato Major.Minor.Patch (&lt;a href="https://semver.org/" rel="noopener noreferrer"&gt;SemVer&lt;/a&gt;).

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Major&lt;/strong&gt;: Alterações que quebram compatibilidade.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Minor&lt;/strong&gt;: Novas funcionalidades.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Patch&lt;/strong&gt;: Correções de bugs.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Metadados opcionais (não obrigatórios mas fortemente recomendados):&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Authors&lt;/strong&gt; Nome do autor ou autores do pacote.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Uma breve descrição do propósito do pacote.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PackageLicenseExpression&lt;/strong&gt;: Especifica a licença sob a qual o pacote é distribuído.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Atualize o arquivo .&lt;strong&gt;csproj&lt;/strong&gt; para incluir essas informações:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F89870cwcsdoy3k0jydm2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F89870cwcsdoy3k0jydm2.png" alt="Arquivo .csproj" width="777" height="367"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Compilando o pacote
&lt;/h2&gt;

&lt;p&gt;Com os metadados configurados, é hora de compilar o pacote. No terminal, execute:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;dotnet&lt;/span&gt; &lt;span class="n"&gt;pack&lt;/span&gt; &lt;span class="p"&gt;--&lt;/span&gt;&lt;span class="n"&gt;configuration&lt;/span&gt; &lt;span class="n"&gt;Release&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse comando criará um arquivo .&lt;strong&gt;nupkg&lt;/strong&gt; na pasta bin/Release.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0hqb023yysu4xs6z90ov.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0hqb023yysu4xs6z90ov.png" alt="Localização do pacote compilado" width="366" height="206"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Testando localmente
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Configurando a Fonte Local:&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Dentro do projeto, crie uma pasta para os pacotes locais:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;mkdir&lt;/span&gt; &lt;span class="n"&gt;NuGetLocal&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Copie o arquivo .&lt;strong&gt;nupkg&lt;/strong&gt; gerado para essa pasta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;cp&lt;/span&gt; &lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Release&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;examplePackage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Convert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="m"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nupkg&lt;/span&gt; &lt;span class="n"&gt;NuGetLocal&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Adicione a pasta como uma fonte NuGet:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;dotnet&lt;/span&gt; &lt;span class="n"&gt;nuget&lt;/span&gt; &lt;span class="k"&gt;add&lt;/span&gt; &lt;span class="n"&gt;source&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;caminho&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;completo&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;para&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;NuGetLocal&lt;/span&gt; &lt;span class="p"&gt;--&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="n"&gt;NuGetLocal&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Consumindo o Pacote no Projeto:&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Você pode criar um projeto console para testes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;dotnet&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;console&lt;/span&gt; &lt;span class="p"&gt;--&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="n"&gt;ExamplePackageTest&lt;/span&gt;
&lt;span class="n"&gt;cd&lt;/span&gt; &lt;span class="n"&gt;ExamplePackageTest&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use o comando dotnet add package para instalar o pacote:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;dotnet&lt;/span&gt; &lt;span class="k"&gt;add&lt;/span&gt; &lt;span class="n"&gt;package&lt;/span&gt; &lt;span class="n"&gt;examplePackage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Convert&lt;/span&gt; &lt;span class="p"&gt;--&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt; &lt;span class="m"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Testando o Pacote
&lt;/h2&gt;

&lt;p&gt;Abra o arquivo &lt;strong&gt;Program.cs&lt;/strong&gt; do projeto de teste e use o pacote:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Friirfv6wsay6rkoz3tdq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Friirfv6wsay6rkoz3tdq.png" alt="Importando pacote da fonte local" width="800" height="243"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd123n0bvkc5mmi2jmw01.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd123n0bvkc5mmi2jmw01.png" alt="Utilizando pacote da fonte local" width="800" height="218"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Publicação
&lt;/h2&gt;

&lt;p&gt;Após validar seu pacote, é hora de publicá-lo. Acesse sua conta em &lt;a href="https://www.nuget.org/" rel="noopener noreferrer"&gt;NuGet.org&lt;/a&gt;, vá até o seu perfil e crie uma nova chave.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpvjfb3ozoz75bqijmmrd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpvjfb3ozoz75bqijmmrd.png" alt="Gerando chave para publicação de pacotes" width="800" height="687"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No terminal, use o comando abaixo para publicar seu pacote no NuGet:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;dotnet&lt;/span&gt; &lt;span class="n"&gt;nuget&lt;/span&gt; &lt;span class="n"&gt;push&lt;/span&gt; &lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Release&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="n"&gt;examplePackage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Convert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="m"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nupkg&lt;/span&gt; &lt;span class="p"&gt;--&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="n"&gt;SuaAPIkEY&lt;/span&gt; &lt;span class="p"&gt;--&lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="c1"&gt;//api.nuget.org/v3/index.json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pronto, se tudo estiver correto após alguns minutos, o pacote estará disponível no &lt;a href="http://nuget.org/" rel="noopener noreferrer"&gt;NuGet.org&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2ptnm395so7h1w2g567d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2ptnm395so7h1w2g567d.png" alt="Pacote publicado" width="800" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Agora que você aprendeu a criar, testar e publicar pacotes NuGet, pode começar a criar os seus próprios pacotes para facilitar o seu trabalho e, quem sabe, ajudar outras pessoas com as suas soluções.&lt;/p&gt;

&lt;h2&gt;
  
  
  Materiais Relacionados e Referências
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/nuget/what-is-nuget" rel="noopener noreferrer"&gt;NuGet: Introdução&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/nuget/reference/nuspec" rel="noopener noreferrer"&gt;Referência do .nuspec&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/nuget/create-packages/publish-a-package" rel="noopener noreferrer"&gt;Publicando Pacotes no NuGet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://semver.org/" rel="noopener noreferrer"&gt;SemVer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://abhishek-ankush.medium.com/creating-custom-nuget-package-in-c-f620c3c67cd8" rel="noopener noreferrer"&gt;Creating Custom NuGet Package in C#&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.treinaweb.com.br/blog/o-que-e-o-nuget" rel="noopener noreferrer"&gt;O que é o NuGet? | Blog da TreinaWeb&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=E0rPteTWxYQ&amp;amp;ab_channel=dotnet" rel="noopener noreferrer"&gt;Creating and Publishing a NuGet Package [Pt 3] | NuGet for Beginners&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>csharp</category>
      <category>nuget</category>
      <category>dotnet</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Como Definir o Contexto Adequado ao Construir um Dockerfile</title>
      <dc:creator>Gabriel Batista</dc:creator>
      <pubDate>Thu, 05 Oct 2023 05:15:30 +0000</pubDate>
      <link>https://dev.to/devgabrielb/como-definir-o-contexto-adequado-ao-construir-um-dockerfile-1ee4</link>
      <guid>https://dev.to/devgabrielb/como-definir-o-contexto-adequado-ao-construir-um-dockerfile-1ee4</guid>
      <description>&lt;p&gt;Quantas vezes você já se deparou com a situação em que tentou criar um Dockerfile e, de repente, ele não conseguia copiar os arquivos para o container? A razão por trás disso pode estar relacionada à escolha do contexto adequado.&lt;/p&gt;

&lt;p&gt;Quando trabalhamos com Dockerfiles, é fundamental entender que o Docker utiliza um diretório como ponto de partida inicial para a construção da imagem. Isso significa que apenas os arquivos presentes nesse diretório e seus subdiretórios são acessíveis durante o processo de build. &lt;/p&gt;

&lt;p&gt;Por exemplo, considere a seguinte estrutura de diretórios:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;├ exemplo dockerfile
│   ├── docker
│   │   ├── Dockerfile
│   │   └── .dockerignore
│   └── package.json
│   └── server.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dockerfile:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FROM node:18

# Create app directory

WORKDIR /app

COPY package*.json ./

RUN npm install

COPY . .

EXPOSE 8080

CMD [ "node", "server.js" ]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se tentarmos executar o comando de build a partir do diretório &lt;code&gt;docker&lt;/code&gt;, como o exemplo a seguir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker build -t image/teste .
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nos deparamos com o seguinte erro:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmipgwccad9kyiumdwlqe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmipgwccad9kyiumdwlqe.png" alt="error docker build" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esse erro ocorre devido a incapacidade do Docker de localizar os arquivos desejados, uma vez que o contexto atual, ou seja, o diretório &lt;code&gt;docker&lt;/code&gt;, não inclui o diretório pai que contém os arquivos relevantes.&lt;/p&gt;

&lt;p&gt;Então, qual é a solução?&lt;/p&gt;

&lt;p&gt;Para garantir que a compilação seja bem-sucedida, é crucial ampliar o contexto de construção. Em vez de executar o comando de build a partir do diretório &lt;code&gt;docker&lt;/code&gt;, você deve retornar à raiz do projeto e, em seguida, utilizar o seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker build -f docker/Dockerfile -t image/teste .
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vamos analisar cada componente desse comando:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;docker build:&lt;/strong&gt; Este é o comando que dá início ao processo de construção da imagem Docker.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;-f docker/Dockerfile:&lt;/strong&gt; Especifica o arquivo Dockerfile a ser usado para construir a imagem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;-t image/teste:&lt;/strong&gt; Essa opção define um nome (ou uma "tag") para a imagem que será criada.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;".":&lt;/strong&gt; O ponto no final do comando indica o contexto de construção, ou seja, o diretório no qual o Docker procurará o Dockerfile e quaisquer outros arquivos necessários para a construção da imagem. O ponto representa o diretório atual.&lt;/p&gt;

&lt;p&gt;Após a execução bem-sucedida dessa instrução, você pode esperar o seguinte resultado:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl9ca9qgrmm4btwyc3v2q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl9ca9qgrmm4btwyc3v2q.png" alt="docker build success" width="800" height="209"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Com essa abordagem, você consegue especificar qual Dockerfile deseja utilizar e também indicar qual é o contexto. O ponto "." representa a raiz do projeto e instrui o Docker a considerar esse ponto como o contexto inicial para a construção da imagem.&lt;/p&gt;

</description>
      <category>docker</category>
      <category>tutorial</category>
      <category>programming</category>
      <category>node</category>
    </item>
  </channel>
</rss>
