2020年にシュッとPerlの環境構築をする
ということで必要に応じて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を使います
plenvの初期設定
基本的にgit clone
して構築します
(homebrewにもありますが関連するプロジェクトのバージョンが古かったり、 brewのformularから削除しようという動きもあるので素直にgit clone
しましょう)
-
plenv
本体をgit clone
する$git clone https://github.com/tokuhirom/plenv.git ~/.plenv
-
パスをシェルの設定ファイルに書き加える
$echo 'export PATH="$HOME/.plenv/bin:$PATH"' >> ~/.bash_profile
- zshの場合は
~/.zshrc
などに読み替える
-
plenv経由でビルドしたPerlコマンドなどの初期化ルーチンをシェルの立ち上げ時に行う設定を書き加える
$echo 'eval "$(plenv init -)"' >> ~/.bash_profile
-
perlのビルドツールの
perl-build
をインストールする$git clone https://github.com/tokuhirom/Perl-Build.git ~/.plenv/plugins/perl-build/
-
シェルを再起動する
$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
は その名の通り
- 対象のバージョンのソースコードをダウンロードする
- 自動でローカルマシン上ビルドする
- よしなにリンクを張る
という順でビルドが進みます。
そのため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
コマンドは使うまでにだいぶ難易度を要するので、現代ではcpanm
やcpm
などを使ったやり方がおすすめです。
cpanm
cpanmは現在Perlモジュールをインストールする際のデファクトみたいになっているツールです。cpanm自体もCPANモジュールですので、正確にはApp::cpanminus
という名前になっています。
cpanmのinstallはplenv
を使っている場合は$plenv install-cpanm
で可能です。
cpm
cpmとはcpanmを平行に動かし、かつライブラリのビルドのキャッシュを利用することで高速にモジュールダウンロードを実現したライブラリです。またPerlのモジュール管理ツールCarton
のファイル形式であるcpanfile
やcpanfile.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