Perl의 모듈은 기본적으로 CPAN이라는 Perl 모듈 네트웍을 통해서 자동으로 다운로드하고 빌드하여 설치하는 방식을 따른다. CPAN에서 tarball을 수동으로 다운로드하여 빌드하고 설치할 수도 있지만, 패키지 관리는 cpan이라는 명령에 의해 자동화되어 있는 셈이다.
cpan은 interactive shell이면서 뒤에 모듈 이름을 적어주면 기본적으로 설치 명령으로 동작하게 된다.
cpan
cpan Test::More
cpan 대신 다음과 같이 풀어 쓸 수도 있다.
pel -MCPAN -e "install Test::More"
cpan의 설정이나 설치 관련 파일들은 모두 사용자 홈 디렉토리의 .cpan 디렉토리에 모여 있다.
cpan을 처음 실행하면 다음과 같은 메시지가 나오는데 계속 엔터를 입력하거나 적당히 번호를 골라주면 초기 설정이 완료된다.
cpan
/home/terzeron/.cpan/CPAN/MyConfig.pm initialized.
CPAN is the world-wide archive of perl resources. It consists of about
100 sites that all replicate the same contents all around the globe.
Many countries have at least one CPAN site already. The resources
found on CPAN are easily accessible with the CPAN.pm module. If you
want to use CPAN.pm, you have to configure it properly.If you do not want to enter a dialog now, you can answer 'no' to this
question and I'll try to autoconfigure. (Note: you can revisit this
dialog anytime later by typing 'o conf init' at the cpan prompt.)Are you ready for manual configuration? [yes]
이 중에서 몇 가지 유의해야 할 질문들이 있는데 다음을 참고하면 된다.
Your terminal expects ISO-8859-1 (yes/no)? [yes] no
Parameters for the 'perl Makefile.PL' command?
Typical frequently used settings:
PREFIX=~/perl non-root users (please see manual for more hints)
Your choice: [] PREFIX=/home1/terzeron/perl
이걸 그대로 입력하면 안 되고 자신이 사용할 디렉토리로 지정해야 한다.
그리고 대륙과 국가를 선택하고 CPAN FTP 서버를 선택하면 된다. (2번, 9번, 1번) cpan shell이 뜨면 install Bundle::CPAN을 입력하여 기본 모듈을 설치한다. (install CPAN도 가능한 옵션인데, Bundle::CPAN에 비해서는 의존하는 모듈 수가 적은 것 같다.) FTP 서버보다는 HTTP 서버를 앞쪽에 선택할 수 있다면 FTPpassive mode가 동작하지 않는 네트웍 환경에서는 유리할 것이다. (Perl의 기본 모듈인 Net::FTP가 passive mode를 제대로 지원하지 않음)
이 과정이 완료되면 .cpan/CPAN/MyConfig.pm에 사용자 설정이 기록된다. MyConfig.pm을 다시 작성하려면 지우고 이 과정을 반복할 수도 있고, 아니면 vi로 직접 편집할 수도 있으며 cpan(interactive shell)에서 o conf init을 실행할 수도 있다.
cpan> o conf init
보통 초기화 과정에서 설치 디렉토리를 default로 설정된 /usr/lib/perl5 정도의 경로로 잡게 되는데, 몇 가지 항목을 사용자 디렉토리로 지정해야 한다.
'makepl_arg' ⇒ q[PREFIX=/home1/terzeron/perl],
'mbuild_arg' ⇒ q[-install_base /home1/terzeron/perl],
'mbuildpl_arg' ⇒ q[PREFIX=/home1/terzeron/perl],
cpan에서도 비슷하게 설정이 가능하다.
cpan> o conf mbuildpl_arg "PREFIX=/home1/terzeron/perl"
cpan> o conf mbuild_arg "--install_base /home1/terzeron/perl"
cpan> o conf makepl_arg "PREFIX=/home1/terzeron/perl"
cpan> o conf commit
이렇게 되면 Perl 모듈이 빌드되고 /home1/terzeron을 설치 기본 디렉토리로 간주하여 /home1/terzeron/lib에 모듈을 설치하고 /home1/terzeron/man에 모듈 매뉴얼을 설치하게 된다.
이론적으로는 이렇게 하면 다 될 것 같지만, 실제로는 규칙을 지키지 않은 모듈 때문에 빈번하게 나타나는 오류 패턴이 있다.
wget http://search.cpan.org/CPAN/authors/id/Y/YV/YVES/ExtUtils-Install-1.54.tar.gz
tar xvfz ExtUtils-Install-1.54.tar.gz
cd ExtUtils-Install-1.54
perl Makefile.PL PREFIX=/home1/terzeron/perl
make all test install
확실하진 않지만, ExtUtils::Install 뿐만 아니라 ExtUtils::MakeMaker의 경우에도 마찬가지로 새로 받아서 PREFIX를 따로 지정해서 설치해주어야 한다.
그럼에도 불구하고 일부 모듈은 Makefile 대신 Build 스크립트를 만들어서 빌드하는 경우가 있는데 이럴 때 PREFIX가 잘 전달되지 않아서 시스템 디렉토리에 설치하려고 하는 문제점이 발생한다. 이럴 때는 .cpan/build/모듈디렉토리에 들어가서 위의 ExtUtils::Install 모듈을 빌드하듯이 Makefile을 우선 만들고 make를 실행하여 빌드하고 테스트하고 설치하면 된다.
perl Makefile.PL PREFIX=/home1/terzeron/perl
make all test install
이렇게 설치된 모듈을 사용하려면 PERL5LIB 환경 변수가 설정되어야 한다. 아니면 Perl 코드 맨 위에 -I 옵션을 이용해서 지정할 수도 있다.
#!/usr/bin/perl -I /home1/terzeron/perl/lib
그러나 perl 프로그램을 특정 경로에서 찾는 방식은 결코 바람직하지 않다. 일반적인 유닉스 스크립트 헤더 스타일은 다음과 같은 게 좋다.
#!/usr/bin/env perl
대신 환경변수 PERL5LIB을 이 스크립트가 받을 수 있도록 설정해주는 방식을 권장한다.
이후에도 계속 특정 사용자 디렉토리를 Perl 모듈을 찾는 경로로 사용하려면 PERL5LIB 환경변수를 설정해줄 필요가 있다. .bashrc에 다음과 같은 항목을 추가해야 한다.
export PERL_HOME=${HOME}/perl
export PERL5LIB=${PERL_HOME}/lib64/perl5:${PERL_HOME}/lib64/perl5/site_perl:${PERL_HOME}/lib/perl5:${PERL_HOME}/lib/perl5/site_perl
export PATH=${PERL_HOME}/bin:${PATH}
다음 명령으로 이 환경 변수들이 잘 적용되었는지 확인해보자.
. ~/.bashrc
perl -V
가끔 모듈을 설치하다보면 알 수 없는 이유로 설치가 안 되는 경우가 종종 생긴다. 대부분은 테스트 케이스가 많이 실패하여 그런 것인데, 다음 명령을 이용하면 강제로 설치가 가능하다. (그래도 특별히 문제가 안 생긴다.)
cpan> force install WWW::Curl::Simple
정작 특정 모듈은 설치가 되었는데도 그 모듈이 의존하고 있는 다른 모듈은 설치가 안 되어서 실행이 제대로 안 되는 경우가 있는데, 이건 답이 없다. 그냥 수동으로 복사해줘야 한다.
예를 들면, 최근에 Perl 5.8.5에서 CPAN 모듈을 사용자 디렉토리에 설치하는 작업에서 반복적으로 이런 현상이 나타났는데, 그 중에서 몇 가지 기억나는 모듈은 cpan 설정을 무시하고 시스템 디렉토리에 설치하려다가 권한 획득에 실패하여 더 이상 설치가 진행되지 않았다.
Module::Runtime를 예로 들어보자. .cpan/build/Module-Runtime-버전 디렉토리로 들어가서 lib이나 blib/lib 디렉토리 밑에 있는 Module 디렉토리를 사용자 디렉토리에 복사하면 된다.
cp -r lib/Module /home1/terzeron/perl/lib/perl5/site_perl/5.8.5/
Module 디렉토리가 이미 존재하면
cp -r lib/Module/Runtime /home1/terzeron/perl/lib/perl5/site_perl/5.8.5/Module/
사용자 디렉토리에 Perl 모듈을 설치하는 것은 Perl 버전에 따라 아주 쉬울 수도 있고 아주 어려울 수도 있다. 시스템에 설치된 cpan이 구버전이라면 최신 버전 cpan으로 업그레이드하는 것조차 많은 난관을 거쳐야 할 것이다. Installing Perl Modules을 참고하여 도전해보자. 개인적으로는 Mac OS X에 perlbrew를 설치해서 사용하고 있다.