Em novembro do ano passado, uma surpresa tomou conta do mundo da informática, a toda poderosa Microsoft, oficialmente, tornou-se membro Platinum da
Linux Foundation. Testamos o passo a passo do próprio site da Microsoft para instalação do
DOTNET Core em ambiente
GNU/Linux e resolvemos alguns problemas encontrados.
Os erros encontrados, seria muito legal a Microsoft corrigir, mas de qualquer forma, a impressão é que realmente estão fazendo um trabalho bem legal em migrar as tecnologias acima para a plataforma
Linux.
Tamanha surpresa tomou conta dos sites de informática do Brasil e do Mundo, ao fazer uma pesquisa rápida sobre o assunto, selecionei apenas alguns, mas a lista é grande dos diversos meios que resolveram noticiar e comentar sobre a notícia.
Abaixo, algumas notícias de alguns sites pelo Brasil e pelo mundo:
- Microsoft torna-se membro platinum da Linux Foundation [1]
- O improvável aconteceu: Microsoft se junta à Linux Foundation [2]
- Microsoft se une a Linux Foundation e manifesta apoio ao Software Livre [3]
- Microsoft joins the Linux Foundation [4]
- Microsoft é a mais nova integrante da Linux Foundation [5]
- Microsoft Fortifies Commitment to Open Source, Becomes Linux Foundation Platinum Member [6]
- Microsoft joins the Linux Foundation [7]
- O que significa a entrada da Microsoft para a Linux Foundation? [8]
Com essa notícia vieram algumas especulações, o que será migrado para o Linux? SQL Server? ASPNET Core? Visual Studio?
A ideia inicial desse artigo é ser uma trilogia onde o primeiro artigo será este. O segundo artigo, uma aplicação ASPNET Core MVC simples. E o terceiro e último, uma aplicação ASPNET Core API com acesso a BD Postgres.
Ambiente
Os testes abaixo foram realizados em uma máquina 64 bits rodando a distribuição Kali Linux (Rolling Release) totalmente atualizado, o que foi um pequeno problema que irei relatar mais adiante.
Instalando DOTNET
O próprio site da Microsoft [9] possui um passo a passo bem interessante sobre como instalar o SDK DOTNET no Linux. No meu caso, como estou utilizando uma máquina com Kali, escolhi seguir o passo a passo da distribuição Debian (para quem não sabe o Kali, é baseado no Debian).
Abaixo, o passo a passo comentado:
sudo apt-get install curl libunwind8 gettext
# instalará os pacotes necessários para a continuação da instalação (atenção: verifique se a distribuição Linux que esteja utilizando possui o apt-get, caso contrário, utilize o gerenciador de pacotes apropriado)
curl -sSL -o dotnet.tar.gz https://go.microsoft.com/fwlink/?linkid=843453
# download do DOTNET Core
sudo mkdir -p /opt/dotnet && sudo tar zxf dotnet.tar.gz -C /opt/dotnet
# criará a pasta /opt/dotnet e copiará os arquivos descompactados para ela
sudo ln -s /opt/dotnet/dotnet /usr/local/bin
# criará um link do DOTNET na pasta "bin" do Linux
Pronto, feito os passos acima, seu DOTNET Core está configurado no Linux. Agora iremos testá-lo. Para isso, execute o comando abaixo:
dotnet --help
Ao executar o comando acima, deverá exibir as seguintes opções, conforme ilustra a imagem 1.
Mas, esse seria o mundo perfeito e, no meu caso, não foi o que aconteceu. Ao invés de aparecer a imagem1, o que apareceu foi a seguinte mensagem:
Failed to initialize CoreCLR, HRESULT: 0x80131500
Após algumas pesquisas na internet, descobri que era necessário instalar mais um pacote:
sudo apt-get install icu-devtools
Fiz a instalação, porém, continuou sem funcionar. Algumas novas pesquisas e descobri que o pacote estava certo, mas era necessário a versão 52.1 do pacote, e utilizando o
apt-get, o comando instala a versão mais atual, que é a 57.1-5.
Então, mais uma vez pesquisei na internet e achei o pacote necessário:
Realizei a instalação, executei novamente
dotnet --help e apareceu a imagem 1. Hora de ir para a segunda parte do teste e criar uma aplicação Hello World. Para isso, continuei seguindo o site da Microsoft [9].
dotnet new console -o hello
O resultado da aplicação hello criada com sucesso, deveria ser algo parecido com a imagem 2.
Vai parecer repetitivo, mas o mundo não é tão perfeito assim, não na primeira tentativa. E quando executei o comando acima, tive o resultado abaixo.
Unhandled Exception: System.TypeInitializationException: The type initializer for 'Crypto' threw an exception. ---> System.TypeInitializationException: The type initializer for 'CryptoInitializer' threw an exception. ---> System.DllNotFoundException: Unable to load DLL 'System.Security.Cryptography.Native.OpenSsl': The specified module could not be found.
(Exception from HRESULT: 0x8007007E)
at Interop.CryptoInitializer.EnsureOpenSslInitialized()
at Interop.CryptoInitializer..cctor()
--- End of inner exception stack trace ---
at Interop.Crypto..cctor()
--- End of inner exception stack trace ---
at Interop.Crypto.GetRandomBytes(Byte* buf, Int32 num)
at System.IO.Path.GetCryptoRandomBytesOpenSsl(Byte* bytes, Int32 byteCount)
at System.IO.Path.GetCryptoRandomBytes(Byte* bytes, Int32 byteCount)
at System.IO.Path.GetRandomFileName()
at Microsoft.DotNet.InternalAbstractions.TemporaryDirectory..ctor()
at Microsoft.Extensions.EnvironmentAbstractions.DirectoryWrapper.CreateTemporaryDirectory()
at Microsoft.DotNet.Configurer.NuGetPackagesArchiver..ctor()
at Microsoft.DotNet.Cli.Program.ConfigureDotNetForFirstTimeUse(INuGetCacheSentinel nugetCacheSentinel)
at Microsoft.DotNet.Cli.Program.ProcessArgs(String[] args, ITelemetry telemetryClient)
at Microsoft.DotNet.Cli.Program.Main(String[] args)
Aborted
E lá vamos mais uma vez pesquisar soluções pela internet e, depois de várias pesquisas, eis que encontro o site[10], o qual já deu a dica de todos os problemas que iria enfrentar pela frente e, mais uma vez, os problemas eram as versões dos pacotes instalados. Entretanto fui ao estilo Jack, por partes.
Primeiramente, resolvi a "libssl", a do meu computador estava 1.0.2 e precisava da 1.0.0, então baixei no site e instalei-a:
Executei novamente
dotnet new console -o hello e agora sim tive o resultado esperado na imagem 2. Entrei no diretório da aplicação
cd hello e executei o seguinte comando:
dotnet restore
E finalmente, iremos testar o HelloWorld criado pelo template e finalizarmos o nosso teste, com o comando:
dotnet run
No meu teste, ao executar o comando acima, ao invés de exibir a mensagem Hello World, apresentou um problema de segmentação, conforme ilustra a imagem 4.
Como eu quis ir por partes, não fiz o downgrade do pacote "libcurl3", conforme o site [10] solicitava. Esse pacote, no meu caso, deu um pouco mais de trabalho, encontrei o pacote no site:
... e realizei o download. Para instalar, realizei os seguintes procedimentos:
# dpkg --force-downgrade -i libcurl3_7.38.0-4+deb8u5_amd64.deb
# forcei para que fosse feito o downgrade
# apt-mark hold libcurl3
# marquei o pacote libcurl3 para que ele não seja atualizado, isso evita que ao utilizar o comando apt-get upgrade, ele seja atualizado.
Após realizar os procedimentos acima, executei novamente o comando
dotnet run e finalmente exibiu a tão esperada mensagem Hello World, conforme ilustra a imagem 5.