Você já ouviu falar em Self Contained Application?

Se você desenvolve em .NET provavelmente já se perguntou se tudo o que é preciso para a sua aplicação funcionar está na pasta de publicação, certo ? Normalmente temos dezenas, as vezes centenas de DLLs que precisamos levar para o ambiente de produção, e esquecer uma delas pode ser um caos total!

Bom, se você já está desenvolvendo para .NET Core isto está sendo resolvido de uma forma muito interessante: Bem vindo ao Self Contained App.

Imagine distribuir a sua aplicação, junto com Framework e todas as dependências, tudo em um único local, ou seja, não é preciso instalar o .NET Core no ambiente de produção, pois ele vai junto com a sua aplicação.

Isto é possível há algum tempo no .NET Core. Vamos a um exemplo bem simples. Vou criar uma aplicação console para trabalharmos o exemplo, as você pode criar outros tipos de aplicação também. (Nestes exemplos vou usar a linha de comandos, pois algumas funcionalidades ainda não estão disponíveis na IDE).

Para criarmos a aplicaçao console:

dotnet new console

Agora temos uma aplicação console criada. Tradicionalmente executamos o comando “publish” para publicarmos a nossa aplicação. Vou fazer isto usando o diretório “pub” como exemplo:

dotnet publish -o pub

Olhando o diretório “pub” temos os arquivos da aplicação. Até aqui nada de novo ok! Vou acrescentar um pacote ao projeto, o NewtonSoft.Json, só para exemplificar a publicação com um pacote:

dotnet add package Newtonsoft.Json

Vou publicar novamente e veremos o resultado:

Ok, agora temos também a Newtonsoft.Json.dll. Agora você pode copiar tudo para a produção, instalar o .NET Core Runtime e tá pronto!

Mas vamos melhorar isto, fazendo uma publicação Sefl Contained, publicando com algumas informações a mais:

  • plataforma de destino
  • modo release
  • parâmetro do self contained

Então o comando fica assim:

dotnet publish -r win-x64 -c release –self-contained -o pubself

Explicando o comando:
-r win-x64 indica que a plataforma de destino será Windows 64 bits
-c release indica que estamos publicando no modo release
–self-contained indica que tudo estará na para de publicação, incluindo o .NET Core Runtime.

Veja que eu mudei o diretório para “pubself” e o conteúdo agora é a aplicação e o .NET Core runtime:

Com o conteúdo deste diretório podemos rodar nossa aplicação em um computador com Windows x64, sem precisar instalar o .NET Core Runtime. (para uma lista das plataforma acesse aqui),

Isto já está bom, mas ainda são muitos arquivos para copiar! E se você pudesse colocar tudo isto em um único arquivo?

Com o .NET Core 3.0 Preview 6 isto é possível com o parâmetroSelfContainedFile=true no comando publish, veja:

dotnet publish -r win-x64 -c release -o pubself2 /p:PublishSingleFile=true

Veja o resultado:

Agora temos tudo em um único arquivo, otimizado! Mas ainda ficou um pouco grande, certo! Para isto temos mais um comando: PublishTrimmed, veja:

dotnet publish -r win-x64 -c release -o pubself2 /p:PublishSingleFile=true /p:PublishTrimmed=true

Este comando demora um pouco mais, pois ele irá otimizar o uso das DLLs e construir um arquivo bem menor, veja:

Resumindo, agora com um único arquivo, você tem toda a aplicação e o RunTime do .NET Core para executar!

Se você ainda não começou a usar o .NET Core, comece agora mesmo. A versão que estou usando neste artigo, neste momento, ainda é um preview, então não aconselho usar em produção, mas logo deve sair a versão final e você com certeza já estará preparado!

Abraços e até a próxima!