Começando com Crystal

8/29/2021

Dediquei um pouco desse último final de semana de Agosto para ler um pouco e brincar com Crystal. A instalação da linguagem é tranquila, mas o troubleshooting foi osso de resolver.

Bom, primeiro preciso dar o contexto dos meus problemas. Eu uso o WSL2 porque funciona e porque eu edito código quase que exclusivamente no Vim (NeoVim) e além disso, uso bastante o tmux e tmuxinator.

Em segundo caso, eu uso o Ubuntu no WSL2 seguindo a mesma ideia de antes, porque funciona e não tenho dores de cabeça.

Para instalar os programas, eu uso o Linuxbrew, que é o Homebrew para Linux, é uma mão na roda e recomendo você usar, caso ainda não use.

Nesse contexto, instalar o Crystal é igual abrir um pirulito, basta executar:

$ brew install crystal-lang

Sem o $, óbvio.

Criar um projeto é fácil também. Seguindo a documentação, é só rodar crystal init app <nome do app> e tá feito.

Quando vou aprender uma linguagem de programação nova, eu gosto de ter um feedback rápido. Gosto de jogar código e executar esse código quase que instantaneamente. Por isso gosto tanto de linguagens interpretadas que possuam um bom REPL.

Aparentemente Crystal não tem um REPL oficial. Sei que existe o icr, mas ainda não dediquei tempo para brincar com isso.

Eu estava tão animado com a linguagem que preferi seguir pelo que considero, a segunda melhor abordagem para aprender uma linguagem nova: testes automatizados.

Não sei se você já tentou aprender alguma coisa dessa forma, caso não, recomendo demais. Tu tanto aprende a linguagem, quanto também aprende a lidar com o framework de testes padrão. Nesse caso eu criei um projeto chamado crystal_scratchpad, adicionei um teste no arquivo crystal_scratchpad_spec.cr e... erro.

Essa é a parte do troubleshooting que comentei antes. Deu um maldito erro numa lib chamada libpcre.so.1. Cara, que problema bem chato de resolver.

Eu já tinha instalado essa lib no meu sistema operacional (Ubuntu no WSL2), porém não havia jeito de fazer o Crystal encontrar essa lib. Ah, instalei a lib usando o apt, também testei instalando ela usando o linuxbrew e nada feito.

Também tentei reiniciar o WSL2 e nada de funcionar. Aí fui revirar a internet atrás de uma solução e encontrei esse blog com algumas dicas para tentar resolver os problemas de instalação do NGiNX. Wat? É, mas o erro no caso, era o mesmo.

Aqui vai uma dica: quando você não encontrar alguma solução direta para o problema que você tem, tente alguma solução indireta.

O problema era que a lib estava instalada tanto no Ubuntu quanto no Linuxbrew, porém ela não foi adicionada ao caminho com as outras bibliotecas compartilhadas. A solução? A mesma que o autor mostrou no blog, encontrar onde estavam instaladas as diferentes versões da libpcre,


$ find / -name libpcre.so.1
/home/linuxbrew/.linuxbrew/lib/libpcre.so.1
(cortei o resto)

Então agora basta adicionar o caminho das libs do linuxbrew no path das libs do meu sistema operacional e tá feito o carreto:

$ export LD_LIBRARY_PATH=/home/linuxbrew/.linuxbrew/lib:$LD_LIBRARY_PATH

Ah, eu também já adicionei essa linha nas minhas configurações do zshell.

Feito isso, ao executar o comando crystal spec, as coisas funcionaram 🎆🎆🎆, a última parte foi deletar todas as libliotecas que instelei no Ubuntu na tentativa frustrada de fazer as coisas funcionar.

Ah, sobre Crystal? Vou escrever alguns posts sobre a linguagem. Gostei muito da forma como Crystal é parecido com Ruby. Independente da performance, também quero testar os frameworks web que existem para Crystal. Já sei que Kemal e Lucky são os mais ativos. Também tem o Amber que parece meio morto, mas acho que vale a pena dar uma olhada também.

De cara curti que ao criar uma aplicação, já existe uma suíte de testes pré configurada, embora tenha dado tanto trabalho pra fazer funcionar.

Bateu curiosidade sobre o código na imagem do post? É esse aqui:

require "./spec_helper"

class Challenge
  def initialize(@description : String, @level : String)
  end

  def pretty
    "#{@description} is #{@level}"
  end
end

describe CrystalScratchpad do
  it "install Crystal is easy" do
    challenge = Challenge.new(description: "Crystal installation", level: "Easy")

    challenge.pretty().should eq("Crystal installation is Easy")
  end
end

👈 Todos os artigos📝 Edite esta página

🤘

Tenha um dia estonteante