(1)はこちら、(2)はこちらから。
利用と配布
作成したコマンドラインツールを使う場合、ソースコードを取得して依存ライブラリをインストールし、プログラムを実行する、というのが大まかな手順です。たとえばソースコードをGitHubで管理している場合、次のような流れになるでしょう。
自分以外のユーザーにコマンドラインツールを使ってもらう場合、より簡単に導入、実行できるよう、CPANモジュールとして公開することでCPANクライアントで導入させたり、FatPackerで単一の実行ファイルとして動かせるようにしたり、Dockerによって動作環境自体をお膳立てするなどの方法があります。
CPANで公開する
CPANはPerlのモジュール管理・配信システムで、本連載第21回「Carton & cpanm ── Perlモジュール管理最新事情」でも取り上げています。コマンドラインツールをモジュールとしてCPANに登録した場合、適切に依存モジュールの情報を定義しておけば、cpan/cpanm
コマンドでコマンドラインツール(モジュール)をインストールする際に依存モジュールも自動的にインストールされ、コマンドラインツールが更新されたときのアップデートも簡単になります。
メリットの多いCPANでの配布ですが、CPANは実用的なモジュールを登録する場ですので、個人的なコマンドラインツール(自分のサーバだけでの動作を前提とするようなもの)や、開発途中のコマンドラインツールを登録するのは問題があります。不特定多数の使用を想定して作られたコマンドラインツールが一定の完成度になったときにCPANでの公開を検討するのが望ましいと思います。
FatPackerを使って1ファイルにまとめる
App::FatPacker
というライブラリに付属するfatpack
コマンドを使うと、コマンドラインツールのスクリプトと、スクリプトが依存している外部ライブラリのソースコードを1つにまとめたプログラムを生成してくれます。
こうして生成したcmd_fat.pl
は、Perlさえインストール済みの環境であれば依存ライブラリをインストールすることなく実行できます。そのため、たとえばcurl
コマンドと組み合わせてcurl -L https://raw.githubusercontent.com/kan/command-perl/master/cmd_fat.pl | perl -
のように、ワンライナーでダウンロードと実行を行ってもらうこともできます。
依存モジュールの数が多かったり、サイズの大きいモジュールに依存していたりする場合、FatPacker
でpack
したあとのファイルサイズはかなり大きくなります。そのためこの手法で配布するのは、依存モジュールの数がそこまで多くなく、頻繁には更新を繰り返さないコマンドラインツールが向いていると言えます。先ほど登場したcpanm
コマンド(App::cpanminus
)は、cpanm
コマンド自体の初回インストールをこの手法で行っています。
Dockerfileを配布してDockerコンテナ上で実行する
コマンドラインツールのリポジトリにDockerfile
を含めておくと、Dockerを導入済みの環境でコマンドラインツールを利用しやすくなります。Dockerfile
は、Perlのコンテナイメージをベースに依存モジュールをあらかじめインストールする内容になります。一例を示します。
実際に利用する場合、次のような実行手順になります。
自分でDockerイメージをビルドする場合、準備の時間や手間は、依存ライブラリを手動でインストールしてコマンドラインツールを動かす場合と大差ありません。しかし、Perlのバージョンを指定できること、依存ライブラリのインストールに必要な外部ライブラリ(libxmlなど)が存在する場合にその導入も済ませられること、WindowsやMacなどの環境ではDockerの導入さえ済んでいれば実行できることがメリットになります。さらに、作ったDockerイメージをDocker Hubに登録すれば、利用する側はdocker pull
とdockerrun
の実行だけで済むようになります。
まとめ
今回は、Perlでコマンドラインツールを実装する際に役立つモジュールや、設計の指針になりそうな考え方について紹介してきました。みなさんがツールを作るにあたって参考になれば幸いです。
さて、次回の執筆者は石垣憲一さんで、テーマは「Perl 5.26で変わること」です。お楽しみに。
- 特集1
イミュータブルデータモデルで始める
実践データモデリング
業務の複雑さをシンプルに表現!
- 特集2
いまはじめるFlutter
iOS/Android両対応アプリを開発してみよう
- 特集3
作って学ぶWeb3
ブロックチェーン、スマートコントラクト、NFT