블로그 이미지
JEEN

서울에 사는 꽃청년의 IT찌질모험기

Rss feed Tistory
IT/Perl 2008.09.01 11:31

[ Perl ] App::CLI 로 시작하는 커맨드라인 어플리케이션

  YAPC::Asia 2007, 2008 에서 여러차례 언급되었고, 현재 저희 회사에서도 Web Framework + CLI 로 사용하고 있는 App::CLI에 대해서 간단하게 적어보고자 합니다. 정말로 매뉴얼을 찾기 힘든 모듈이지만, 사용하기에는 너무 편리한 CLI Framework 인데요.

  보통 Perl 스크립트에서는 맛볼 수 없는 구성으로 쉽게 유지보수가 가능한 코드를 써나갈 수 있습니다. POD 를 이용해서 문서를 써나갈 수도 있구요. GetOption 모듈을 안에 담고 있어서, 여러가지 옵션을 스크립트에 간단하게 줄 수 있습니다.

  현재 저희 회사에서는 Webframework + CLI 라는 형태로... webframework 에서 가지는 설정값을 CLI 에서 그대로 사용가능하게 되어있어서, 별도의 DB 스키마 구성을 설정할 필요없이 커맨드라인 명령어를 통해서 정기적인 작업을 수행하도록 하고 있습니다.

  그럼 간단하게 App::CLI 에 대해서 얘기해보겠습니다.

  App::CLI 는 SVK 로 유명한 clkao 에 의해서 만들어진 모듈이며, 위에서 설명했다시피 CLI framework 라고도 불리는 모듈입니다. 그의 대표적인 SVK 가 이 App::CLI 를 기반으로 만들어졌다고 합니다.
  그리고 Best Practical 의 Jifty 에도 사용되고 있다고 하는군요. CPAN 모듈 페이지에서도 자세한 문서가 없기때문에 소스를 보는 게 가장 도움이 된다고 하는군요.

  그래서 소스를 보겠습니다.

 MyApp.pm
 package MyApp;
 use base 'App::CLI';
 1;


 MyApp/Hello.pm
 package MyApp::Hello;
 use base 'App::CLI::Command';

 sub options {
  ( 'name=s' => 'name' )
 }
 
 sub run {
  my ($self, @args) = @_;

  print "Hello, Are you ".($self->{name} || 'BlahBlah') ."?¥n";
 }
 1;

 app.pl
 use MyApp;
 MyApp->dispatch;

  가장 기본적인 구성입니다.
  MyApp.pm 이 이 커맨드라인 어플리케이션의 Root 가 되는 것이구요. MyApp::Hello 는 hello 라는 CLI 어플리케이션이 되는 것이죠. 그리고 그 hello 를 실행시키기 위해서 app.pl 이 있는 것입니다.

  그렇다면, 어떻게 실행시키느냐..

  perl app.pl

은 훼이크 입니다. 실행시킬 커맨드를 지정해줘야죠.

  perl app.pl hello

그렇다면 결과는?

  Hello, Are you BlahBlah?

가 됩니다. sub run{} 에서 지정한 액션이 실행되는 것입니다.
 그렇다면 이건 어떨까요?

  perl app.pl hello --name=Saillinux

이렇게 Option 을 던져줬습니다. 그러면 sub options {} 에서 name 옵션을 지정해놓았다면, 그 name 옵션을 sub run{} 에서 사용할 수 있습니다.
 
  $self->{name}

 이렇게 말이죠. 물론 ( 'name=s' => 'name' ) 이라는 것이 무엇을 의미하는 지 좀 더 자세히 알고 싶으시다면, GetOpt::Long 같은 모듈을 살펴보시길 권합니다.

 - Getopt::Long - Extended processing of command line options - search.cpan.org

  그럼 hello 말고 다른 커맨드를 추가하고 싶다면?
  생각하시는대로 MyApp::YourCommand 를 추가하시면 됩니다.
  그리고 MyApp::Hello 와 같은 구조로  만들어나가시면 되겠죠?

  그러면 hello 가 무엇을 하는 놈인지 알아야하지 않을까요? 간단하게 도움말을 써넣어보겠습니다.

  MyApp/Help.pm
package MyApp::Help;
use base 'App::CLI::Help'
1;

=head1 ACTION
perl app.pl help help

=head1 BLAH
blahblah
=head1 PLEASE
blahblah
=cut

 이런식으로 MyApp::Help 아래에 간단하게 POD 를 추가했습니다.

perl app.pl help help

 그리고 이런식으로 실행하면.. MyApp::Help 에 기재된 POD 를 해석해서 표시합니다.
 혹은 MyApp::Hello 에도 마찬가지로 적당한 설명을 POD 로 써넣어..

 perl app.pl help hello

 와 같은 명령으로 hello 의 도움말을 간단하게 불러올 수 있겠죠?
 이같이 스크립트안의 POD 를 불러와서 해석할때는 POD::Usage 같은 모듈을 참조하시면 됩니다.
- Pod::Usage, pod2usage() - print a usage message from embedded pod documentation - search.cpan.org
  제가 App::CLI 에 대해서 아는 부분은 여기까지네요.
실제 이것을 사용해서, 관리하는 사이트의 RSS Feed 를 작성하거나, 정기적인 일괄작업을 수행한다거나 하고 있습니다.
언젠가 기회가 되신다면 한번쯤 써보시는 것도 좋을 듯 합니다. +_+
신고
TOTAL 466,715 TODAY 34

티스토리 툴바