🐪

2020年にシュッとPerlの環境構築をする

2020/10/07に公開

ということで必要に応じてPerlの環境構築をする必要が出てきた場合におすすめの方法です。
また、macOSにデフォルトでついているperlはおもしろパッチがあたっている影響で、一部perlモジュールが上手く動かないことや、インストールに失敗する傾向にあります。
そのため、macOSでperlを使った何かをしようとしていて、よくわからないエラーにぶち当たった場合はとりあえずperlの環境構築をすると治るケースが多々あります。

このエントリではPerlに関係する次のものの構築を解説します。なおPerl6はすでにRakuという名前に改名されており、別言語扱いとなっています。

  • Perl本体
  • Perlのモジュールインストール

基本的にmacOSを想定していますが、UNIX環境では大体同じだと思われます。

Perl本体の構築

それではまずPerl本体の構築を行いましょう。現段階ではmacOSには標準で入っていますが、前述の通りmacOSのシステムPerlはパッチが入っているので、構築し直すのをおすすめしています。

ちなみにPerlは偶数が安定版、奇数が開発版ですので、2020/10/07現在の最新安定版は5.32.0となっています。

brewを使う

筆者はあまりbrewでinstallしたperlを使っていませんが、一応brewでも入ります

$brew install perl

env系

バージョンごとで管理したいケースや、anyenvなどでまとめて管理したい場合におすすめのツール群です。

  • plenv
    • シェルスクリプトベース
    • rbenvやpyenvなどと操作感は同じ
  • perlbrew
    • perlで書かれたバージョン切り替えツール

今回はplenvを使います

plenvの初期設定

基本的にgit cloneして構築します

(homebrewにもありますが関連するプロジェクトのバージョンが古かったり、 brewのformularから削除しようという動きもあるので素直にgit cloneしましょう)

  1. plenv本体をgit cloneする

    • $git clone https://github.com/tokuhirom/plenv.git ~/.plenv
  2. パスをシェルの設定ファイルに書き加える

    • $echo 'export PATH="$HOME/.plenv/bin:$PATH"' >> ~/.bash_profile
    • zshの場合は~/.zshrcなどに読み替える
  3. plenv経由でビルドしたPerlコマンドなどの初期化ルーチンをシェルの立ち上げ時に行う設定を書き加える

    • $echo 'eval "$(plenv init -)"' >> ~/.bash_profile
  4. perlのビルドツールのperl-buildをインストールする

    • $git clone https://github.com/tokuhirom/Perl-Build.git ~/.plenv/plugins/perl-build/
  5. シェルを再起動する

    • $exec $SHELL -l

plenvでのperlのビルド

このあたりは他の*envと同様です。

  • インストール可能なperlのバージョンを確認
    • $plenv install -l
  • 何かしらのバージョンを指定してインストール
    • $plenv install 5.32.0
  • 全体のバージョン切り替え
    • $plenv global 5.32.0
  • ディレクトリ個別でバージョン切り替え
    • $plenv local 5.32.0

perlを使わずにplenvで最新のperlを取得する

plenvでperl-buildを使う場合はperlに依存してしまうので避けたい。しかしperlをソースコードから手でビルドするのも手間...というときにおすすめな手法です。

この場合は純粋にシェルスクリプトで実装されたperl-installを使うとperlに依存せずに最新のperlを取得可能です。なお利用する際は最初にperl-buildのプラグインを削除しておく必要があります。

$rm -rf $(plenv root)/.plenv/plugins/perl-build
$git clone https://github.com/skaji/perl-install $(plenv root)/plugins/perl-install

ローカルマシンでビルドしない手法

plenvがデフォルトで使用を進めているperl-buildは その名の通り

  1. 対象のバージョンのソースコードをダウンロードする
  2. 自動でローカルマシン上ビルドする
  3. よしなにリンクを張る

という順でビルドが進みます。
そのためperlをビルド出来る環境(Cコンパイラなど)を予め用意しておく必要があります。
環境を作るのがめんどくさい + perlのビルドにマシンスペックがおいつかない場合はローカルでのビルドは避けたほうが良いでしょう。

この問題にはplenv-downloadをplenvプラグインとして使うと良いです。

git clone https://github.com/skaji/plenv-download ~/.plenv/plugins/plenv-download
# download the latest relocatable perl
plenv download latest

installではなくdownloadになっているのが注意ポイントです。

perl-installは内部的に後述するrelocatable-perlを利用しています。

relocatable-perl

relocatable-perlはPerl5.10移行のrelocatableビルドオプション(Perlのモジュール解決パスが集まった配列の@INCを再定義可能)を指定してビルドしたx86-64なLinux及びMacOSのビルド済みのperlインタプリタを提供するプロジェクトです。

TravisCIでビルドしているようで、GitHub releaseページから対応しているバージョンの一覧を確認する事が可能です。

relocatable-perlを使ったインストール方法はREADMEに書いてありますが、大きく3種類存在しています。

任意のディレクトリにダウンロード

bashスクリプトが用意されているのでワンライナーで可能です。最後の~/perlにはビルドしたいディレクトリのパスをいれます。

$curl -fsSL https://git.io/perl-install | bash -s ~/perl

plenvを使って構築

この場合はplenv-downloadを利用するとrelocatable-perlが使用できます。
(解説は前述の通りです)

tarでダウンロードして自分で設定

curl -fsSL -o perl-x86_64-linux.tar.xz https://github.com/skaji/relocatable-perl/releases/latest/download/perl-x86_64-linux.tar.xz
tar xJf perl-x86_64-linux.tar.xz
mv perl-x86_64-linux ~/wherever-you-want
~/wherever-you-want/bin/perl --version

モジュールをinstallして使いたい

モジュールをインストールする際はcpanコマンドを使おうみたいな記事がありますが、cpanコマンドは使うまでにだいぶ難易度を要するので、現代ではcpanmcpmなどを使ったやり方がおすすめです。

cpanm

cpanmは現在Perlモジュールをインストールする際のデファクトみたいになっているツールです。cpanm自体もCPANモジュールですので、正確にはApp::cpanminusという名前になっています。

cpanmのinstallはplenvを使っている場合は$plenv install-cpanmで可能です。

cpm

cpmとはcpanmを平行に動かし、かつライブラリのビルドのキャッシュを利用することで高速にモジュールダウンロードを実現したライブラリです。またPerlのモジュール管理ツールCartonのファイル形式であるcpanfilecpanfile.snapshotにも標準対応しており、今度はもうcpmだけ使っていればいいのではみたいな気がするツールです。

cpmもPerlモジュールなので、cpanmで入れることも可能ですが、FatPack(一枚岩のPerlスクリプトに変換したもの)のperlスクリプトとして配布しているものがあるので、そちらを使うと便利です。

$ curl -fsSL --compressed https://git.io/cpm > cpm
$ chmod +x cpm
$ ./cpm --version

これだとローカルだけなので、グローバルに入れるときはこんな感じです。

$ curl -fsSL --compressed https://git.io/cpm | perl - install -g App::cpm
$ plenv rehash

cpmはinstallサブコマンドでなにかモジュールをインストールします。
デフォルトでは、カレントディレクトリのlocal以下にダウンロードされます。

$cpm install Path::Tiny

install時に-gをいれるとグローバルにインストールされます。

$cpm install -g Path::Tiny

ここまで書いてわかったんですが、perlの構築方法まとめというよりは@skajiさんの活動まとめみたいになっていますね。ソフトウェア便利に使わせてもらってます。。。!

Discussion