[Rio-pm] use 5.016 ou use strict/warnings

breno breno em rio.pm.org
Sábado Março 2 21:16:08 PST 2013


> Mete um common::sense na bagaça toda e seja feliz!
>> use perl5i;
>>> strict/warnings mas pela simples força do hábito.

perl5i, common::sense, Toolkit, strictures, Real::Handy,
Modern::Perl... todo mundo cedo ou tarde percebe um padrão no seu
código Perl, um conjunto de módulos e pragmata que sempre gosta de
usar em seus projetos. Perl é uma linguagem moldada no formato
TIMTOWTDI, então parece injusto com os desenvolvedores que um ou outro
conjunto de módulos seja ativado por padrão em qualquer código Perl.
Agora, uma vez que você encontrou o *seu* estilo, imagine ter que
escrever isso tudo no cabeçalho de cada novo arquivo:

-----------8<-----------
use 5.16.0;
use warnings;
no indirect;
no autovivification;
use true;
use autodie qw(:all);
use autobox;
use utf8;
use File::stat;
use Time::Piece;
use Try::Tiny;
use Carp qw(croak);
...
----------->8-----------

Complicado, né? Por isso muitos autores acabam criando suas coletâneas
e distribuindo no CPAN, como as citadas lá no começo. No entanto, isso
também não é de graça: usuários do seu módulo agora tem que baixar uma
nova dependência apenas porque você teve preguiça de escrever "use
$modulo"; e você AINDA tem que escrever "use COLETANEA" no inicio de
cada novo arquivo que criar.

Independente da coletânea utilizada, o problema não foi resolvido,
apenas contornado. Mas nada temam, há uma alternativa:

App::MyPerl
==========

Ao instalar o App::MyPerl, você ganha dois programas na linha de
comando: "myperl" e "myprove". A partir daí, basta editar o arquivo
.myperl/modules dentro da raiz do seu projeto e adicionar a lista de
módulos e pragmata que você quer. Por exemplo:

-----------8<-----------
v5.16
warnings
autodie=:all
----------->8-----------

Ao rodar seu programa com "myperl", todos os módulos desse arquivo já
estarão carregados! O mesmo acontece para qualquer biblioteca dentro
de "lib" e "t/lib", o que torna tudo muito mais fácil para o seu
desenvolvimento dentro de diretórios de projetos (como os criados pelo
Module::Starter, shipit ou Dist::Zilla). Tudo isso sem source filters
e sem que os erros e avisos sejam colocados em linhas diferentes (como
o que acontece quando linhas são adicionadas sem modificar o arquivo
original). Para rodar seus testes, é só usar o "myprove" em vez do
"prove".

Os mais safos podem estar pensando: "ok, mas qual a vantagem disso em
relação a simplesmente fazer alias myperl='perl -Mv5.16 -M...'? Não é
tão difícil assim." Tem razão, não é. Mas o "myperl" tem duas grandes
vantagens.

A primeira é que o diretório ".myperl" é criado por projeto. Assim
você pode definir diferentes conjuntos de pragmata dependendo do tipo
de projeto que está criando, por exemplo se é um projeto pessoal
pequeno, um trabalho profissional ou um com determinadas restrições de
ambiente.

A segunda vantagem do "myperl" é que, com ele, você não só tem o perl
com as configurações padrão que bem entender, mas garante que essas
mesmas configurações serão passadas para todos os usuários do seu
módulo automaticamente, sem a inclusão de novas dependências! Como? É
só adicionar a seguinte função ao seu Makefile.PL:

sub MY::postamble {
   qq{distdir: myperl_rewrite\nmyperl_rewrite:
create_distdir\n\tmyperl-rewrite \$(DISTVNAME)}
}

Pronto. Agora, quando for fazer o build para o CPAN, o myperl vai
adicionar as linhas pertinentes no código dentro da sua distribuição
durante o 'make dist' \o/

Enfim, o App::MyPerl é mais uma solução para facilitar a vida de quem
quer módulos e pragmas específicos para seus projetos, só que sem ter
que carregar mais uma dependência ou adicionar uma linha de código
sequer durante o desenvolvimento do seu programa. Adicione alguns
atalhos ao seu gerador de módulos favorito (module-starter, dzil,
shipit, entre outros) e você terá algo bem bacana na sua caixa de
ferramentas!

Disclaimer: ainda há algumas pontas soltas, o projeto acabou de nascer
e não está particularmente maduro - eu mesmo já mandei alguns pull
requests pro Matt - mas vale a pena ficar de olho!


[]s

-b


Mais detalhes sobre a lista de discussão Rio-pm