Desenvolvimento Rápido de Programas Linha de Comando

38
Desenvolvimento Rápido de Programas Linha de Comando Breno G. de Oliveira [email protected]

description

Conheça App::Rad, um moderno framework para o desenvolvimento ágil de programas linha de comando. Não perca tempo com código repetitivo, use App::Rad e concentre-se apenas no que seu programa pode oferecer de melhor.

Transcript of Desenvolvimento Rápido de Programas Linha de Comando

Page 1: Desenvolvimento Rápido de Programas Linha de Comando

DesenvolvimentoRápido de Programas

Linha de Comando

Breno G. de Oliveira

[email protected]

Page 2: Desenvolvimento Rápido de Programas Linha de Comando

Ferramentas Linha de ComandoFerramentas Linha de Comando

● Exibição de ajuda (“help”)● Parsing de argumentos

Tradicionais

● Dispatcher● Help específico● Shell

Orientada a comandos

Page 3: Desenvolvimento Rápido de Programas Linha de Comando

linguagemX

ferramenta

Dicotomia do PerlDicotomia do Perl

Page 4: Desenvolvimento Rápido de Programas Linha de Comando

Perl como ferramenta?Perl como ferramenta?

“Easy things, easy.”

Com Perl, quase tudo é fácil ;-)

Sysadmins e pesquisadores sabem disso(ou deveriam saber)

...e usam Perl diariamente como ferramenta parasolucionar problemas de forma rápida e eficiente(ou deveriam usar)

Page 5: Desenvolvimento Rápido de Programas Linha de Comando

Problemas com Problemas com One-linersOne-liners(e pequenos programas)(e pequenos programas)

“escreva e descarte” (ou tenha pesadelos para manter)

Repetição constante

Baixa escalabilidade e flexibilidade

*cof*cof* documentação? *cof*cof*

Page 6: Desenvolvimento Rápido de Programas Linha de Comando

Modelo TradicionalModelo Tradicional

Getopt::Long + Pod::Usage

Eficiente para programas lineares, mas não escala bem.

Page 7: Desenvolvimento Rápido de Programas Linha de Comando

FrameworksFrameworks

DRY (Don't Repeat Yourself)

Flexibilidade

Escalabilidade

Documentação

Testes

Page 8: Desenvolvimento Rápido de Programas Linha de Comando

Command Line FrameworksCommand Line Frameworks

App::CLI

App::Cmd

CLI::Dispatch

CLI::Framework

Page 9: Desenvolvimento Rápido de Programas Linha de Comando

App::RadApp::Rad

Page 10: Desenvolvimento Rápido de Programas Linha de Comando

App::RadApp::Rad

Simples (e fácil) de instalar e usar

Leve!

Facilmente extensível

Integração com one-liners

Page 11: Desenvolvimento Rápido de Programas Linha de Comando

Meu primeiro programaMeu primeiro programa

use App::Rad;use App::Rad;

App::Rad->run;App::Rad->run;

Page 12: Desenvolvimento Rápido de Programas Linha de Comando

Meu primeiro programaMeu primeiro programa

> ./meuprog.plUsage: ./meuprog.pl  command [arguments]

Available Commands:   help show syntax and available commands

>

Page 13: Desenvolvimento Rápido de Programas Linha de Comando

Adicionando versãoAdicionando versão

use App::Rad;use App::Rad;

App::Rad->run;App::Rad->run;

Page 14: Desenvolvimento Rápido de Programas Linha de Comando

Adicionando versãoAdicionando versão

use App::Rad;use App::Rad;

App::Rad->run;App::Rad->run;

our $VERSION = '0.1.1-pre-alfa';our $VERSION = '0.1.1-pre-alfa';

Page 15: Desenvolvimento Rápido de Programas Linha de Comando

Executando novamenteExecutando novamente

> ./meuprog.plmeuprog.pl version 0.1.1­pre­alfaUsage: ./meuprog.pl  command [arguments]

Available Commands:   help show syntax and available commands

> ./meuprog.pl ­­versionmeuprog.pl version 0.1.1­pre­alfa

>

Page 16: Desenvolvimento Rápido de Programas Linha de Comando

Criando ComandosCriando Comandos

use App::Rad;App::Rad­>run;

sub hello {   return “Hello, World!”;}

Page 17: Desenvolvimento Rápido de Programas Linha de Comando

Criando ComandosCriando Comandos

> ./meuprog.plUsage: ./meuprog.pl  command [arguments]

Available Commands:   hello   help show syntax and available commands

> ./meuprog.pl helloHello, World!

>

Page 18: Desenvolvimento Rápido de Programas Linha de Comando

Criando Comandos Mais InteressantesCriando Comandos Mais Interessantes

use App::Rad;App::Rad­>run;

sub roll :Help(roll a dice in AdX format) {   my $c = shift;   my $value = 0;

   if ( $c­>argv­>[0] =~ m{(\d+)d(\d+)} ) {      for (1..$1) {         $value += int(rand($2) + 1);      }   }   return $value;}

Page 19: Desenvolvimento Rápido de Programas Linha de Comando

Criando Comandos Mais InteressantesCriando Comandos Mais Interessantes

> ./meuprog.plUsage: ./meuprog.pl  command [arguments]

Available Commands:   help   show syntax and available commands   roll   roll a dice in AdX format

> ./meuprog.pl  roll  3d47

>

Page 20: Desenvolvimento Rápido de Programas Linha de Comando

Argumentos SimplesArgumentos Simples

@ARGV

$c->options

$c->argv

$c->getopt

Page 21: Desenvolvimento Rápido de Programas Linha de Comando

Argumentos ExplícitosArgumentos Explícitos

sub setup {     my $c = shift;

     $c­>register_commands({           cmd1  => { arg1 => {                            type      => 'num',                           condition => sub { $_ < 3 },                           required  => 1,                      },                      arg2 => {                           type      => 'str'                      },                    }           }    }}

Page 22: Desenvolvimento Rápido de Programas Linha de Comando

Fluxo do programaFluxo do programa

Page 23: Desenvolvimento Rápido de Programas Linha de Comando

Funções de ControleFunções de Controle

setup()

pre_process()

post_process()

teardown()

Page 24: Desenvolvimento Rápido de Programas Linha de Comando

Compartilhando dados (stash)Compartilhando dados (stash)sub command { my $c = shift; my $ret = do_something();

if ( $ret =~ /critical error/ ) { $c->stash->{mail} = 1; } return $ret; }

sub post_process { my $c = shift;

if ( $c->stash->{mail} ) { # send email alert... } else { print $c->output . "\n"; } }

Page 25: Desenvolvimento Rápido de Programas Linha de Comando

““include” && “exclude”include” && “exclude”

Comandos embutidos

Manipulação de one-liners!

Ambos “opt-in”

use App::Rad qw(include exclude);

Page 26: Desenvolvimento Rápido de Programas Linha de Comando

““include” && “exclude”include” && “exclude”

> perl ­e 'print “FISL!\n”'FISL!

> ./meuprog.pl include ­e 'print “FISL!\n”'

> ./meuprog.pl helpUsage: ./meuprog.pl command [arguments]

Available Commands:   cmd1   include   help   exclude

Page 27: Desenvolvimento Rápido de Programas Linha de Comando

““include” && “exclude”include” && “exclude”

> ./meuprog.pl cmd1FISL!

(enquanto isso, em meuprog.pl...)

sub cmd1 {   my $c = shift;   print “FISL!\n”;}

Page 28: Desenvolvimento Rápido de Programas Linha de Comando

Exemplos mais convincentesExemplos mais convincentes

Pegamos um one-liner “místico”...

> perl ­i ­paF, ­le 'splice @F,1,0,$.;$_=join “,”,@F'  planilha.csv

Fazemos uma substituição simples...

> ./meuprog.pl include adiciona_coluna­i ­paF, ­le 'splice @F,1,0,$.; $_=join “,”,@F'

e voilá!

> ./meuprog.pl  adiciona_coluna  planilha.csv

Page 29: Desenvolvimento Rápido de Programas Linha de Comando

(algumas) funções auxiliares(algumas) funções auxiliares

commands()

is_command( NOME )

register( NOME, CODEREF )

unregister( NOME )

load_config( ARQUIVO)

Page 30: Desenvolvimento Rápido de Programas Linha de Comando

Modo “shell” (REPL)Modo “shell” (REPL)

use App::Rad;use App::Rad;

App::Rad->run;App::Rad->run;

Page 31: Desenvolvimento Rápido de Programas Linha de Comando

Modo “shell” (REPL)Modo “shell” (REPL)

use App::Rad;use App::Rad;

App::Rad->shell;App::Rad->shell;

Page 32: Desenvolvimento Rápido de Programas Linha de Comando

Modo “shell” (REPL)Modo “shell” (REPL)

> ./meuprog.plmeuprog> helpAvailable Commands:   help   show syntax and available commands   quit   exits the program   roll   roll a dice in AdX formatmeuprog> roll 2d109meuprog> quit

>

Page 33: Desenvolvimento Rápido de Programas Linha de Comando

Plugins!Plugins!

Prontos:

● TT● ConfigLoader

Em andamento:

● Log4perl● Daemon● ...?

Page 34: Desenvolvimento Rápido de Programas Linha de Comando

Extensões!Extensões!

MooseX::App::RadMooseX::App::Rad

(em andamento)(em andamento)

Page 35: Desenvolvimento Rápido de Programas Linha de Comando

Módulos interessantes de usarMódulos interessantes de usar

Sysadm::Install

PUNC (Perl Unified Network Controller)

Net::Server

IPC::Cmd

IO::Prompt

Term::Menu

Page 36: Desenvolvimento Rápido de Programas Linha de Comando

Onde encontrarOnde encontrar

Código estável+documentação: CPAN

Bleeding-edge: http://github.com/garu/App-Rad/

Discussão: #app-rad em irc.perl.org

Page 37: Desenvolvimento Rápido de Programas Linha de Comando

Compartilhe sua idéia!Compartilhe sua idéia!

Estaremos no stand de Perl durante todo o evento!

Page 38: Desenvolvimento Rápido de Programas Linha de Comando

Obrigado!Obrigado!

Dúvidas?Dú[email protected]