Blog do VERSALIC


PORTAL DE VISUALIZAÇÃO DO SISTEMA DE APOIO ÀS LEIS DE INCENTIVO À CULTURA

Acompanhe aqui novidades sobre o desenvolvimento do VerSalic!

Avatar Mateus

Mateus Wetah @mateuswetah Post #2

Refatoração para a Versão 2.0 do VerSalic

Também conhecida como: tome cuidado com suas versões no Angular!

Mês passado alguns colegas do Lappis tentaram compilar o código do VerSalic para configurar uma Docker e não tiveram sucesso. Intrigado, fui investigar a situação e vi que nem eu conseguia. A criatura derrotou seu criador! Nesta onda de tentar desenvolver Software Livre a gente muitas vezes se esquece de que o mesmo, antes de tudo, tem que ser livre de nós mesmos.

Então fui analisar a situação. O problema é basicamente na questão das diversas dependências do projeto. Na minha cabeça, termos um package.json com todos as versões de pacotes do projeto listadas seria suficiente pra qualquer npm install deixar tudo em ordem pra qualquer um que baixasse o código do GitHub. Bom, não foi bem assim.


Error! Version vX.X.X not found...

Pra início de conversa, deixei claro no README as versões necessárias para o Node(7.0.4) e NPM(4.0.5). O que eu não contava, era que o link para instalação dessa versão sumiria dos repositórios oficiais do NodeJS! (Sério, saca isso.).

A ingenuidade continuou com o uso da Angular CLI em sua vesão Beta (1.0.0-beta-31) - não confundir com a versão do Angular em si, que já era o 2.4. Embora ainda seja possível usar esta versão em configurações de um projeto, o Angular fez questão de trazer uma mudancinha ou outra de projeto. O arquivo de configuração angular-cli.json, por exemplo, passou a ser um arquivo oculto nas versões mais recentes.

De início pensei que a solução seria montar um Docker com as configurações "legadas" que usei em meu projeto. Não tinha como fazer um docker com Node 7.0.4? Tudo bem, eu usaria a versão mais próxima! E assim o fiz. Logo ao tentar compilar, porém, uma das bibliotecas de terceiros que usei já não estava mais disponível no NPM registry.

Aí o tamanho do trampo começou a ficar claro.

No projeto VerSalic utilizei diversas bibliotecas de terceiros, e na época estive bem satisfeito com elas porque, afinal, uma das mágicas do Angular é te permitir criar e reutilizar componentes e diretivas, o que de fato fez com que muita gente criasse ferramentas incríveis. Dentre essas posso citar um componente de calendar-picker, um componente de botões de compartilhamento, um module para tratar de meta-tags do site, etc.

A questão é que muitas dessas bibliotecas, junto com o Angular, estavam sofrendo constantes mudanças. Algumas tinham acabado de sair da traumática migração do Angular 1 para o Angular 2 e outras estavam encarando novas mudanças quebrantes (como a chegada do Webpack e da compilação Ahead of Time). Nisso, algumas acabaram por retirar do NPM registry versões antigas, que estavam causando dor de cabeça por quebrar o código dos usuários. Algumas até mudaram o nome do projeto (como aconteceu com a de Meta-tags), de modo que ao executar npm install, choviam erros no meu console avisando que não foi possível encontrar tal pacote. A coisa vai ficando pior quando você começa a tentar ajustar as versões, para usar a compatível com seu ambiente. A calendar-picker, por exemplo, depende de uma do Bootstrap... esta tem suas próprias dependências no Angular...


Retrabalho, mas dessa vez no lugar certo.

Ficou claro pra mim que seria mais seguro migrar para uma versão do Angular mais recente e trabalhar com as versões destas bibliotecas que estavam mais consolidadas. Após alguns testes com o Angular 5, descobri que nem todas as que eu estava usando suportavam ele ainda, por isso fiquei no Angular 4 (4.3.0, para ser mais preciso). E mais, eu deveria fazer este desenvolvimento 100% dentro do Docker, para garantir que o ambiente onde tudo foi criado fosse reproduzível e aproveitável. E sim, eu optei por recriar o projeto do zero com a CLI, pra garantir que nenhuma outra mudança de projeto me aparecesse de surpresa.

Docker e Angular

O Dockerfile e as instruções de desenvolvimento podem ser encontrados aqui: https://github.com/mateuswetah/docker-angular. As novas configurações de ambiente, são as seguintes:

  • Node v9.3.0
  • NPM 5.5.1
  • Angular CLI 1.6.1
A ideia é que este Docker possa ser aproveitado para outros projetos Angular também. Basta dar uma olhadinha no package.json do projeto que você quer contribuir, conferir qual a versão da angular-cli que é exigida, e colocar a mesma na variável de ambiente do Dockerfile. A imagem é baseada na imagem oficial do NodeJS.

O retrabalho não foi tão exaustivo como parece, muitos arquivos nem precisaram ser tocados, mas enfrentei algumas dores de cabeça com uma certa chamada de função incorreta acusada pelo compilador ao usar Ahead of Time (basicamente essencial para qualquer projeto Angular em modo produção). O problema é que, um dos issues conhecidos da Angular CLI é o de não informar corretamente a linha de erro quando o mesmo foi identificado durante a compilação com AOT. Porque não procurar um bug na base do tira e põe, não é mesmo? Bom, algumas horas de detetive depois, idendifiquei o problema, que graciosamente não causava nenhum warning nas versões anteriores do Angular ¯\_(ツ)_/¯.


Aproveitando para arrumar a casa.

No processo de atualização, fiz alguns pequenos ajustes de CSS, nada de mais. Porém algumas mudanças boas vieram a versão mais recente da ngx-sharebuttons. Antes, não havia botão de comparilhamento para o Telegram (eu implementei um na unha e alinhei com o componente da sharebuttons). Agora não só temos esse, como temos um útil botão de compartilhar via email e copiar link direto da url :)

Novas opções de compartilhamento

O módulo bootstrap_salic que carrega a versão customizada do bootstrap com as cores do VerSalic agora não fica mais na pasta node_modules e sim na src, pois novas instalações do ambiente iriam sobrescrever esta pasta. Mesmo referenciando o módulo como uma dependência de desenvolvimento, a referência ao arquivo gerava um link que (por razões que ainda não compreendo), não era carregado ao se compilar o código.

Uma requisição antiga já era a mudança da ordenação padrão de Projetos para PRONAC:desc, ao invés de PRONAC:asc. Isso está feito agora, evitando que a página inicial de projetos esteja sempre mostrando os mesmos projetos mais antigos da API.

Por fim, durante meus testes descobri um bug seríssimo na paginação. O issue já foi reportado aqui: https://github.com/mateuswetah/Projeto-Salic/issues/23. Enquanto este problema não é solucionado, mantive as navegações para os limites (primeira página e última página) desabilitadas.


Conclusão.

Pull-request feita, agora o pessoal vai ter um tempinho até poder atualizar o ambiente do servidor e ver se podemos lançar oficialmente. Enquanto isso, o que concluir dessa sina?

O VerSalic foi meu primeiro grande projeto com Angular e certamente tem suas falhas. Depois de oito meses sem olhar pra cara do código, voltar a analisar a coisa me mostrou que tenho muito o que aprender ainda. Certamente aprendi muito daqui pra lá, mas ainda preciso entender como funcionam algumas coisas (pra evitar inclusive esse tipo de retrabalho que tive). Talvez houvessem caminhos mais simples pra resolver o problema das versões em questão, mas como não sou expert, acabei optando pelo caminho das pedras. Hoje, estudando outras frameworks, linguagens, bibliotecas, posso confirmar que o Angular tem sim um calcanhar de aquiles, que é esta questão de "mudanças quebrantes".

Mesmo assim, acredito que agora temos uma boa "base" para futuras contribuições. Muito ainda poderia ser melhorado em termos de documentação para que outras pessoas possam adicionar features sem depender tanto do contato comigo. A própria criação deste blog é uma tentativa de abertura para isso. Embora sejamos extremamente dependes de melhorias também no projeto da API, acho que este site ainda tem sim muito a crescer, se claro, voltarmos a ter esta oportunidade, então...

..até a próxima!


Avatar Mateus

Mateus Wetah @mateuswetah Post #1

Olá Blog!

Primeiro post do Blog do VerSalic.

Este é um espaço modesto para a divulgação das atividades de desenvolvimento do VerSalic, site que demonstra o uso da API de acesso ao SALIC e serve como portal de visualização dos dados da Lei Rouanet mais acessível ao cidadão.


VerSalic - Uma nova forma de consultar e navegar através dos projetos culturais da Lei Rouanet

O VerSalic faz uso da API SALIC para consultas aos dados do Sistema de Apoio às Leis de Incentivo à Cultura (SALIC). Para saber mais sobre a Lei Rouanet, acesse rouanet.cultura.gov.br.

O VerSalic pode ser utilizado em versalic.cultura.gov.br. Descubra e compartilhe dados da Lei Rouanet!

Para contribuir, acesso ao github do projeto: https://github.com/culturagovbr/VerSalic

Configuração do ambiente via docker

Recomendamos fortemente o uso do Docker para trabalhar com este projeto. Siga as instruções deste repositório, considerando a versão 1.6.1 da CLI do Angular:

https://github.com/mateuswetah/docker-angular

Configuração do ambiente na sua máquina

É preciso ter node, npm, typescript e angular cli instalados para a execução do projeto.

A última versão do Node pode ser encontrada aqui. A versão usada para o desenvolvimento é a 9.3.0. Usuários Ubuntu/Debian podem instalar via apt:

$ sudo apt-get update
$ sudo apt-get install nodejs

Geralmente o pacote Node já traz o npm junto, mas caso precise instalar, a versão usada para desenvolvimento é a 5.5.1 Usuários Ubuntu/Debian podem instalar via apt:

$ sudo apt-get install npm

O TypeScript pode ser instalado via npm:

$ npm install -g typescript

Dependendo das configurações npm do seu sistema (em geral Mac e Linux) será necessário o 'sudo' para o npm ter as permissões de instalação.

Por fim, a instalação do Angular CLI também é feita via npm:

$ npm install -g @angular/cli@1.6.1

Mais informações sobre a instalação do ambiente Angular podem ser obtidas na página da CLI. A versão utilizada neste projeto é a 1.6.1. Para verificar a versão atual, basta rodar:

$ ng --version

Instalação

Para que o npm possa baixar os módulos extras necessários para o projeto, navegue para a pasta do projeto e execute a instalação:

$ git clone https://github.com/mateuswetah/Projeto-Salic.git
$ cd Projeto-Salic/
$ npm install

Os módulos necessários são informados no package.json. Possíveis erros na instalação costumam acontecer por incompatilidades nas versões dos módulos. Caso isso ocorra, verifique no console qual a versão do módulo necessária e instale via npm install.

Executando em local server

Para obter um server de desenvolvimeto, execute:

$ ng serve

ou, caso esteja no Docker:

$ ng serve --host 0.0.0.0

Navegue para http://localhost:4200/. O App vai automaticamente se atualizar após qualquer mudança feita nos arquivos fonte.

Gerando build de produção:

Recomendamos testar uma build em produção antes de qualquer pull-request, já que a compilação Ahead of Time (AOT) é sensível a erros que não são percebidos pelo compilador em modo de desenvolvimento. Para compilar em produção, com otimização de assets e minimização dos arquivos js, execute:

$ ng build --prod --aot

Isso irá gerar os arquivos de distribuição na pasta indicada pelo caminho outDir especificado no arquivo .angular-cli.json. Mude para o caminho do seu web server se desejar.

Link para a última versão hospedada

Acesse aqui.