2019년 4월 22일 월요일

도대체 내가 Perl 사용자 자격이 있는가?

오랫동안 Perl을 사용해 왔고, 가끔 초보 수준의 스크립트를 짜면서 '아무리 지저분해도 어쨌든 돌아가면 된다(혹은 한 가지 목적을 달성하는 방법은 여러 가지가 있다)'는 순진한 생각이 Perl의 기본 정신과 맞닿아 있다는 안이한 생각에 빠져 있었다. 그런데 이번에 CentOS 7을 새롭게 설치한 뒤 Perl module을 하나씩 재설치하면서 기본이 없어도 너무 없다는 생각을 갖게 되었다. 아무리 경험이 많아도 정확한 지식을 기반으로 한 것이 아니라면 사상누각과 같지 않겠는가?

일반 사용자 권한으로 Perl -MCPAN -e shell(혹은 명령행에서 cpan 실행)을 처음으로 실시하면 다음과 같은 질문을 던진다. 펄 라이브러리 디렉토리에 쓰기 권한이 없으니 어떻게 할 것이냐는 뜻이 되겠다.

Warning: You do not have write permission for Perl library directories.

To install modules, you need to configure a local Perl library directory or
escalate your privileges.  CPAN can help you by bootstrapping the local::lib
module or by configuring itself to use 'sudo' (if available).  You may also
resolve this problem manually if you need to customize your setup.

What approach do you want?  (Choose 'local::lib', 'sudo' or 'manual')
 [local::lib] 

관리자 권한으로 이 명령을 불러냈음에도 불구하고 왜 local::lib을 쓴다고 했는지 모르겠다. 그러니 .bashrc에 일반 사용자는 접근할 수 없는 위치로PERL_LOCAL_LIB_ROOT PERL_LOCAL_LIB_ROOT PERL_LOCAL_LIB_ROOT PERL_LOCAL_LIB_ROOT 등의 변수가 줄줄이 선언되어서 root를 제외하고는 접근을 하지 못하게 된 것 아니던가.

어떤 펄 모듈의 설치 위치를 알고 싶다면 'perl -I 모듈명'을 입력하면 된다. 다음의 결과를 보라. 빨간색 디렉토리는 local::lib을 쓰겠다고 하는 바람에 root 디렉토리 아래의 위치로 설정된 환경변수를 나타낸다. 상황이 이러하니 BioPerl을 설치했다고 믿었음에도 불구하고 일반 사용자로는 이를 쓸 수 없었던 것이다.

# perldoc -l Bio::Perl
/root/perl5/lib/perl5/Bio/Perl.pm
# perl -e 'print join "\n", @INC; print "\n"'
/root/perl5/lib/perl5/5.16.3/x86_64-linux-thread-multi
/root/perl5/lib/perl5/5.16.3
/root/perl5/lib/perl5/x86_64-linux-thread-multi
/root/perl5/lib/perl5
/usr/local/lib64/perl5
/usr/local/share/perl5
/usr/lib64/perl5/vendor_perl
/usr/share/perl5/vendor_perl
/usr/lib64/perl5
/usr/share/perl5
.

/root/.cpan/CPAN/MyConfig.pm을 삭제한 다음, BioPerl installation 문서에 나온 방법을 이용하여 다시 BioPerl을 설치하였다. 이번에는 /usr/local/share/perl5 아래에 제대로 펄 모듈들이 위치하였다.

App::cpanminus

cpan은 기본적으로 말이 많다. 그것이 성가시다면 cpanminus를 쓰면 된다. Perl이 설치된 시스템에 cpan은 자동적으로 따라오지만, cpanminus는 그렇지 않으니 추가적으로 깔아야 한다. cpan과 마찬가지로 App::cpanminus는 cpanm이라는 스크립트를 통해서 실행된다. 

많은 펄 모듈이 rpm 패키지로도 제공됨을 기억하면 좋다. 즉, cpan 혹은 cpanm 명령이 아닌 yum 명령으로 설치할 수도 있다는 것이다. 내가 App::cpanminus의 rpm 패키지를 설치했던가? 패키지의 이름은 약간 다르므로 주의해야 한다.

$ rpm -qa | grep perl-App-cpanminus
perl-App-cpanminus-1.6922-2.el7.noarch

설치가 된 상태였다. 이를 지우고 관리자로 전환한 다음 cpan에서 App::cpanminus를 실행해 보았다. 앗, 왜 다시 root 디렉토리에 설치를 하는 것인가?

Running make install
Manifying 1 pod document
Manifying 2 pod documents
Installing /root/perl5/lib/perl5/App/cpanminus.pm
Installing /root/perl5/lib/perl5/App/cpanminus/fatscript.pm
Installing /root/perl5/man/man1/cpanm.1
Installing /root/perl5/man/man3/App::cpanminus::fatscript.3pm
Installing /root/perl5/man/man3/App::cpanminus.3pm
Installing /root/perl5/bin/cpanm
Appending installation info to /root/perl5/lib/perl5/x86_64-linux-thread-multi/perllocal.pod
  MIYAGAWA/App-cpanminus-1.7044.tar.gz
  /usr/bin/make install  -- OK

생각을 해 보니 조금 전에 .bashrc에서 Perl 관련 환경변수를 삭제한 뒤에 다시 로그인을 하지 않아서 그런 것이었다. /root/perl5 디렉토리를 제거하고 로그아웃 후 다시 들어와서 cpan을 실행한 다음 'install App::cpanminus'를 실행하여 보았다. 예상한대로 /usr/local/share/perl5 아래에 제대로 설치가 되었고, 명령 프롬프트에서 cpanm을 실행해도 문제가 없다. cpanm 스크립트의 위치(/usr/local/bin/cpanm)은 yum으로 perl-App-cpanminus를 설치했을 때와는 다르다(/usr/bin/cpanm).

Perl의 패키지 관리 시스템은 허술해 보이기도 하지만 또 그런대로 유연하다. Perl package manger(PPM)은 파이썬으로 치자면 pip에 해당하는 것인가? 하지만 펄 라이브러리 설치 위치만 잘 기억하고 있으면 cpan(m)만으로도 충분하다고 생각한다. 몇 개의 환경변수, 그리고 @INC를 잊지 말자.

댓글 없음: