cpanコマンドによるPerlモジュールのローカルインストール
概要
今時Perlを使った開発はあまりない。しかし,既存のソフトウェアがPerlを使っているために,Perlの開発環境が必要になることがある。
Perlのパッケージ管理にはいくつかの方法が存在するようだ。今回はその中でPerl標準コマンドであるcpanコマンドを使ったPerlモジュールのローカルインストール方法をまとめる。
万が一,cpanコマンドがなければ,「インストール: cpan | Perlの標準的なパッケージマネージャー」を参考にインストールしておく。
cpanの初回起動時動作
cpanコマンドは,CPANモジュールを使い引数に指定したPerlモジュールをPerlのパッケージリポジトリーのCPAN (The Comprehensive Perl Archive Network) からインストールするコマンドだ。引数に何も指定しなければ,対話シェルが起動し,そこでCPANモジュールの対話コマンドを実行でき,細かい設定などができる。
なお,以下のようにperlからCPANモジュールを使ってインストールする方法もある。
perl -MCPAN -e "install module-name"
結局はcpanコマンドもCPANモジュールを使っているので,やっていることは同じだ。しかし,わざわざ専用のcpanコマンドが存在しており,こちらを使ったほうがわかりやすいので,cpanコマンドだけを使うことにする。
cpanの初回起動時はcpanの設定を行う。まず,cpanの初回起動時設定を確認・把握し,その後のインストール手順を整理する。この節は参考情報であるため,実際に実行する必要はない。
まず,以下のコマンドでcpanを起動できる。
cpan
cpanを引数なしで起動すると,対話シェルが起動し,初回起動時は以下の設定を自動で行うかの質問が表示される。
角括弧 ([]) の中身がデフォルトだ。これはyesでよいので,そのままEnterを入力する。noを選択した場合,ミラーサイトの設定などを行うことになる。
なお,表示されているとおり,cpanの設定は,Ubuntu 16.04 (cpan 1.61, Perl 5.22.1) では~/.cpan
ディレクトリーに格納される。Ubuntu 18.04 (cpan 1.64, Perl 5.26.1) だと~/.local/share/.cpan
だった。
cpan関係の設定で困ったら,最悪これらのディレクトリーを削除すればやり直せる。また,cpanの設定は対話シェルでo conf init
コマンドにより再設定できる。
cpanコマンドやcpanの対話シェルでの操作はそれぞれ「cpan – perldoc.perl.org」と「CPAN – perldoc.perl.org」に記載がある。
続いて,インストール方法の質問が表示される。
ここのデフォルトがlocal::lib
となっている。自分の知る限り,Ubuntu
14.04からはすでにcpanでのパッケージ管理にはlocal::lib
が標準となっているようだ。ここもそのままで問題ない。すると,インターネットからlocal::lib
のインストールが始まる。
local::lib
の自動インストールにより,以下のファイル群がインストールされる。
インストールが終わると,最後に以下の質問が表示される。
ここでは,local::lib
モジュールを~/perl5
にインストールしたので,そこへのPATHの設定を~/.bashrc
に追記するか質問している。ひとまずデフォルトのyesでよいだろう。この質問が最後だ。
これでcpanの初回起動時設定が完了となる。
cpanの初期設定の問題
cpanの初回起動時設定の動作をひと通り記した。
ここで,cpanの初回起動時設定が全て標準の設定だと問題がある。Perlモジュールのインストール場所が$HOME/perl5
となってしまい,勝手にそこにlocal::lib
モジュールがインストールされてしまうからだ。
「stowによるローカルパッケージ管理」に記した通り,他のパッケージとの整合性を取るために,パッケージのローカルインストールは,~/.local
配下に行いたい。また,環境を汚したくないので,初回のlocal::lib
も~/.local
にインストールされるようにしたい。
調べたところ,local::lib
のインストールの質問は以下の2条件が満たされた場合にのみ発生する。
そこで,local::lib
で使用する変数を利用し,cpanの初期設定を工夫する。
cpanの推奨設定とインストール手順
まず,事前に以下の環境変数を設定して,~/.profile
や~/.bashrc
にも記載しておく。
cpanでパッケージをインストールすると,デフォルトだとmanページのインストール先が~/.local/share/man
ではなく~/.local/man
になっているなど,他のPerl以外のパッケージとディレクトリー構成が異なっている。ディレクトリー構成を統一するための調整を施している。
その後,以下のコマンドでlocal::lib
モジュールをインストールする。
echo | cpan local::lib
上記コマンドにより,local::lib
モジュールが~/.local
にインストールされる。なお,cpan初回起動時の質問を回答するために,echoコマンドで標準入力を渡している。
local::lib
のインストール後は,cpanでインストールするPerlモジュールも~/.local
にインストールされる。上記のLOCAL
環境変数を変更すれば,任意のディレクトリーにPerlモジュールをcpanでインストール可能だ。
例えば,GNU Stowでmake check
に必要なIO::Scalar
モジュールとTest::Output
モジュールは以下のコマンドでインストールできる。
cpan IO::Scalar Test::Output
これでcpanによるPerlのローカルインストールが可能となる。
モジュールのアンインストール
cpanでインストールしたモジュールのアンインストール方法はやや手間がかかる。
以下の回答の通り,cpanは基本的にMakefileを使ってインストールするため,ビルドディレクトリーでmake uninstall
によりアンインストールする。
~/.cpan/build
や~/.local/share/.cpan/build
に,cpanでのインストール時のビルドディレクトリーが存在する (例: Test-Output-1.031-ovRQ3A
)。アンインストール対象のパッケージのビルドディレクトリーにcd
コマンドで移動し,以下のコマンドを実行することでアンインストールを実現する。
make uninstall SITEARCHEXP="$LOCAL/lib/perl5/x86_64-linux-gnu-thread-multi"
ここでは,Makefile内のSITEARCHEXP
変数を引数で上書きしている。Makefile内ではここが/usr/local/lib/perl5/x86_64-linux-gnu/perl/5.22.1
などになっている。make uninstall
時に,ここに格納されているファイルをアンインストールしようとして,ファイルが存在しないために以下のエラーが出ていたため,上書きした。
なお,buildディレクトリーにパッケージのディレクトリーが存在しない場合,再度cpanで該当パッケージをインストールして,パッケージディレクトリーを用意して対応する。
また,Module::Build
を使っているパッケージなどはこの方法ではアンインストールできない。cpanでインストールしたモジュールのアンインストールはやっかいな問題だ。
一番手っ取り早いのは,App::cpanminus
パッケージをインストールしてcpanm
コマンドでアンインストールすることだ。cpanmはCPANのサイト (Installing Perl Modules – www.cpan.org) でも推奨されているパッケージマネージャーでもある。
まず以下のコマンドでcpanm
をインストールする。
cpan App::cpanminus
App::cpanminus
をインストールしたら-U/--uninstall
オプションを指定して,アンインストール対象パッケージを指定するとアンインストールしてくれる。
cpanm -U App::cpanminus
cpan
だと手間のかかるパッケージのアンインストールが実に簡単にできる。
local::lib
の環境変数
最後にlocal::lib
で使用している環境変数をまとめる。
環境変数 | 説明 |
---|---|
PATH | コマンドのパス (:区切り)。 |
PERL5LIB | Perlの@INCの対象パスのリスト (:区切り)。 |
PERL_LOCAL_LIB_ROOT | local::lib の有効なパスのリスト (:区切り)。 |
PERL_MB_OPT | Module::Build のBuild.PL やBuild処理に追加されるコマンドラインオプション。 |
PERL_MM_OPT | ExtUtils::MakeMakerのMakeMaker->new() ,つまりWriteMakefile() に使われるコマンドラインオプション。 |
これらの環境変数は以下のサイトで説明されている。
PERL_MM_OPT
とPERL_MM_OPT
はそれぞれExtUtils::MakeMaker
(Makefile.PL) とModule::Build
(Build.PL) と競合するのでインストール時に問題が発生した場合に注意する。
結論
cpan
によるPerlモジュールのローカルインストール方法を記した。
これで新しくPerlモジュールが必要になっても,cpan
でローカルにインストールして解決できるだろう。
“cpanコマンドによるPerlモジュールのローカルインストール” に対して2件のコメントがあります。