Instalando módulos Perl com cpanm e Carton

O compartilhamento de código em Perl é feito por meio de módulos que são distribuídos na forma de pacotes que contém também as instruções para instalação e configuração desses módulos.

A principal fonte de módulos e pacotes em Perl é um repositório chamado CPAN (Comprehensive Perl Archive Network), que pode ser acessado pelo site metacpan.org.

O CPAN está online desde 1995 e possui atualmente mais de 196 mil módulos de mais de 14 mil autores diferentes. Se você precisa fazer alguma coisa em Perl, provavelmente já existe um módulo pronto no CPAN. Se não existe, você pode criar um e fazer o upload para lá.

Por muito tempo, a instalação de módulos foi feita por um aplicativo de linha de comando chamado... cpan, que depois de corretamente configurado era capaz de baixar e instalar os módulos de forma bem simples.

O problema era que essa configuração nem sempre foi muito simples. Você vai encontrar pela internet vários tutoriais ensinando como configurar o aplicativo cpan.

Por essas e outras já faz algum tempo que utilizamos uma opção mais moderna, um outro aplicativo chamado cpanm, criado pelo Tatsuhiko Miyagawa, muito mais simples, que não necessita configuração e ainda um monte de outras vantagens que vamos deixar pra outro dia.

A instalação tanto do cpanm quanto do carton (que vamos discutir mais abaixo), foi mostada no post anterior.

Instalando um módulo com o cpanm

A instalação de um módulo que esteja no CPAN é muito simples. Desde que você tenha acesso à internet, basta digitar no seu terminal:

user@host$ cpanm Paginator::Lite
--> Working on Paginator::Lite
... muitas linhas depois...
Successfully installed Paginator-Lite-2.001003
61 distributions installed
user@host$

O cpanm vai baixar a versão mais recente Paginator::Lite no formato .tar.gz pra em seguida desempacotá-lo e executar os comandos para o build, teste e posterior instalação do módulo, instalando também todas as dependências necessárias durante o processo.

Para converir que o módulo está instalado, basta executar:

user@host$ perl -MPaginator::Lite -E 'say $Paginator::Lite::VERSION'
2.001003
user@host$

Aqui vale ressaltar os passos que incluem build, teste e instalação porque os módulos no CPAN são distribuídos como código-fonte.

O código-fonte é então configurado e se tiver alguma parte em escrita em linguagem C, vai ser compilado especificamente para a sua máquina. Além disso, testes unitários são executados antes da instalação para garantir que o módulo funcionará corretamente.

Por isso, durante a instalação, você vai precisar ter na sua máquina as ferramentas pardão de build, como o make e eventualmente um compilador C, conforme comentamos no post anterior.

O comando cpanm possui diversas opções interessantes e a que eu mais utilizo é é a -L, que indica um diretório arbitrário onde instalar os módulos ao invés de instalar nos diretórios padrões.

user@host$ cpanm -L my-local-libs Paginator::Lite

O comando acima vai instalar o módulo Paginator::Lite no ditretório my-local-libs e você poderá referenciá-lo no seu código usando:

#!/usr/bin/env perl

use local::lib 'my-local-libs';
use Paginator::Lite;
...

Instalando uma versão específica de um módulo

Vimos que utilizando o cpanm podemos instalar a versão mais recente de qualquer módulo no cpam. Mas e se precisarmos de uma versão específica de determinado módulo? E se precisarmos de uma funcionalidade específica do Paginator::Lite que não existe na versão atual e que só existia na versão 1.03?

Uma solução seria baixar o tar.gz da versão específica e proceder com a instalação manualmente. Mas e se você tiver mais algum módulo com um problema semelhante, isso pode começar a ficar complicado.

Ao invés disso, podemos utilizar o carton, um aplicativo de linha de comando, também criado pelo Tatsuhiko Miyagawa, cujo objetivo é justamente travar determinadas versões de módulos que o seu projeto utiliza.

Para isso ele utiliza um arquivo de configuração chamado cpanfile e instala os módulos num diretório local do seu projeto, chamado... local.

Vamos criar um diretório para o nosso projeto e dentro dele um arquivo cpanfile com o seguinte conteúdo:

requires 'Paginator::Lite' => '== 1.03';

Em seguida basta executar:

user@host$ carton install
Installing modules using /home/blabos/my-project/cpanfile
Successfully installed Paginator-Lite-1.03
1 distribution installed
Complete! Modules were installed into /home/blabos/my-project/local
user@host$

O carton vai instalar os modulos dentro do diretório local, seguindo uma herarquia de diretórios particular do Perl.

user@host$ tree -L 2 local/
local
├── bin
├── cache
│   ├── authors
│   └── modules
└── lib
└── perl5

6 directories, 0 files
user@host$

Note que esse diretório é completamente independente dos outros diretórios onde os módulos eram instalados anteriormente e você vai precisar indicar ao Perl onde procurar pelos módulos.

Isso pode ser feito indicando diretamente no código, como mostrado anteriormente, ou de forma mais portável, utilizando o próprio comando carton.

Vamos criar um arquivo script.pl com o conteúdo abaixo:

#!/usr/bin/env perl

use v5.32;
use Paginator::Lite;

say $Paginator::Lite::VERSION;

E vamos executá-lo com o seguinte comando:

user@host$ perl script.pl
2.001003
user@host$

Note que essa é a versão instalada previamente via cpanm. O script via buscar os módulos nos diretórios que ele conhece e ele não sabe sobre a existência do diretório local.

Agora execute o mesmo script só que a partir do carton:

user@host$ carton exec -- perl script.pl
1.03
user@host$

O carton vai configurar as variáveis de ambiente necessárias para que o script reconheça o módulo instalado no diretório local do projeto.

Conclusão

No post de hoje apresentamos o uso do comando cpanm para instalar manualmente um módulo Perl distribuído via CPAN.

Também mostramos como utilizar o comando carton para gerenciar as versões de dependências do seu projeto.

Junto com o post anterior, agora você é capaz de instalar com o plenv uma versão específica da linguagem Perl, completamente isolada da versão do sistema, além de também ser capaz instalar módulos com o cpanm e gerenciar dependências do deu projeto com o carton.