ぱいぱいにっき

Pythonが好きすぎるけれど、今からPerlを好きになりますにっき

aquaでperlを入れて使えるようになりました

この記事はPerl Advent Calendar 2024、14日目の記事です。昨日はaragathさんによる次のPerlはPerl 42(かも)でした。確かに5.40の5.の部分って変わらないしバージョン番号としては意味がないよな(そもそもバージョン番号ではなく言語名の方含まれる)とは思っていましたが、もし5がなくなると寂しい感じはしますね。ただMySQLも5.7の次が8だったもんな、と考えるとそういう流れかもしれません。

この記事の元ネタ

github.com

aquaって何?

suzuki-shunsukeさんが開発を行なっているCLIツールのパッケージマネージャーです。僕がよく使うのはterraformです。デプロイツールであるecspressolambrollなども入れられます。

他のパッケージマネージャーとしてはhomebrewや、asdfがあります。これらとの違いは、aquaはビルドツールの実行を(ほとんどのケースでは)しないという点です。これにより速やかにツールのインストールができたり、ビルドツールの差異などでインストールが失敗するということがありません。

また、良い点として、インストールされているCLIのバージョンを設定するaqua.yamlが配置されたディレクトリ以下では、そのCLIツールのバージョンに固定される点です。プロジェクトごとに使っているCLIのバージョンが違う場合でも、スムーズに作業ができます。

また、僕は最近は言語ランタイムもaquaで管理しています。具体的にはGoとbun(TypeScript)です。Dockerを使えばいいのにという指摘もあるかと思いますが、この2つの言語はプラットフォームによる差異があまりなく、むしろDockerのオーバーヘッドであったり、制限に振り回されるデメリットの方が大きいので、最近はDockerを使わずにaquaでランタイムを管理し、ホスト側に完結してWebアプリケーション開発を行なっています。

perlを入れて使えるようになりましたとは?

以下のPull Requestでaquaで入れられるツールを管理する、aquaproj/aqua-registryに追加していただきました。

github.com

具体的に使う手順を示します。まず、aquaを使える状態にして、次のコマンドでカレントディレクトリにaqua.yamlを作成します。

$ aqua init

そして、今回追加したパッケージである、skaji/relocatable-perlaqua.yamlに導入します。

$ aqua g -i skaji/relocatable-perl

最後に、以下のコマンドで、実際にパッケージを落としてきてインストールします。

$ aqua i

これでaqua経由で入れたperlが使えるようになりました。

$ which perl
/Users/mackee/.local/share/aquaproj-aqua/bin/perl
$ perl -v

This is perl 5, version 40, subversion 0 (v5.40.0) built for darwin-2level

Copyright 1987-2024, Larry Wall

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl".  If you have access to the
Internet, point your browser at https://www.perl.org/, the Perl Home Page.

使用上の注意点としては、cpanmでモジュールを入れた時の、実行スクリプトのパスです。僕の設定の場合は、~/.local/share/aquaproj-aqua/pkgs/github_release/github.com/skaji/relocatable-perl/5.40.0.1/perl-darwin-arm64.tar.gz/perl-darwin-arm64/bin/に置かれてしまいます。インストールされているperlのバージョンごとにパスを通すのは困難なので、次の例のようにcpanm -L localのようにカレントディレクトリ配下に入れて利用するのが良いと思われます。

$ cpanm -L local App::cpm
...
$ ./local/bin/cpm --version
cpm 0.997021 (./local/bin/cpm)
perl version v5.40.0 (/Users/mackee/.local/share/aquaproj-aqua/pkgs/github_release/github.com/skaji/relocatable-perl/5.40.0.1/perl-darwin-arm64.tar.gz/perl-darwin-arm64/bin/perl)

skaji/relocatable-perlって何

skajiさんが作成している、ビルド済みのポータブルなperlパッケージです。perlをインストールするには、本来gccやclangなどのC言語コンパイラや、その他ビルドツールが必要ですが、relocatable-perlではビルド済みなので不要です。また、インストールするディレクトリを選ばない特徴があります。

このような特徴があるため、インストール時にビルドを行わないaquaであってもperlを入れることができます。

なお、Node.jsではこのようなバイナリが公式で配布されています。そしてNode.jsはaquaですでに利用可能です。Pythonではryeが利用しているgithub.com/indygreg/python-build-standaloneがあります。RubyではHomebrewが利用しているHomebrew/homebrew-portable-rubyがあります。python-build-standaloneはすでにaquaの作者の方によるPull RequestがありますがRubyは存在しません。Rubyの方でいいなと思われた方は、コントリビューションチャンスかと思います。

なんでperlなの

僕は常々、シェルスクリプトで複雑なメンテナンススクリプトの類を書くのは思考停止的で違う手段も検討した方が良いのではないかと唱えています。

先日YAPC::Hakodate 2024で発表もしました

一方で、perlはほとんどの開発者の環境に入ってはいるものの、バージョン管理であったりすでに入っているperl環境を汚さずに利用することは少々知識が必要です。なので、aquaというツールに乗って、シェルスクリプトの代わりにperlを利用することを手助けできないかと考えて、利用できるようにしてみました。

さて、明日のPerl Advent Calendar 2024 15日目はAnaTofuZさんで「なんかかきます」です。何が出てくるでしょうね? 楽しみですね