Perl Hackers Hub

第45回Perlで作るコマンドラインツール―オプション、サブコマンド、設定ファイルへの対応(3)

(1)こちら⁠2)こちらから。

利用と配布

作成したコマンドラインツールを使う場合、ソースコードを取得して依存ライブラリをインストールし、プログラムを実行する、というのが大まかな手順です。たとえばソースコードをGitHubで管理している場合、次のような流れになるでしょう。

リポジトリをローカルにクローンする
$ git clone [email protected]:kan/command-perl.git
$ cd command-perl
依存ライブラリをインストールする
$ cpanm --installdeps .
コマンドを実行する
$ perl command.pl

自分以外のユーザーにコマンドラインツールを使ってもらう場合、より簡単に導入、実行できるよう、CPANモジュールとして公開することでCPANクライアントで導入させたり、FatPackerで単一の実行ファイルとして動かせるようにしたり、Dockerによって動作環境自体をお膳立てするなどの方法があります。

CPANで公開する

CPANはPerlのモジュール管理・配信システムで、本連載第21回Carton & cpanm ─⁠─ Perlモジュール管理最新事情でも取り上げています。コマンドラインツールをモジュールとしてCPANに登録した場合、適切に依存モジュールの情報を定義しておけば、cpan/cpanmコマンドでコマンドラインツール(モジュール)をインストールする際に依存モジュールも自動的にインストールされ、コマンドラインツールが更新されたときのアップデートも簡単になります。

メリットの多いCPANでの配布ですが、CPANは実用的なモジュールを登録する場ですので、個人的なコマンドラインツール(自分のサーバだけでの動作を前提とするようなもの)や、開発途中のコマンドラインツールを登録するのは問題があります。不特定多数の使用を想定して作られたコマンドラインツールが一定の完成度になったときにCPANでの公開を検討するのが望ましいと思います。

FatPackerを使って1ファイルにまとめる

App::FatPackerというライブラリに付属するfatpackコマンドを使うと、コマンドラインツールのスクリプトと、スクリプトが依存している外部ライブラリのソースコードを1つにまとめたプログラムを生成してくれます。

App::FatPackerをインストールする
$ cpanm App::FatPacker
依存ライブラリと1つにまとめたスクリプトを出力する
$ fatpack pack cmd.pl > cmd_fat.pl

こうして生成したcmd_fat.plは、Perlさえインストール済みの環境であれば依存ライブラリをインストールすることなく実行できます。そのため、たとえばcurlコマンドと組み合わせてcurl -L https://raw.githubusercontent.com/kan/command-perl/master/cmd_fat.pl | perl -のように、ワンライナーでダウンロードと実行を行ってもらうこともできます。

依存モジュールの数が多かったり、サイズの大きいモジュールに依存していたりする場合、FatPackerpackしたあとのファイルサイズはかなり大きくなります。そのためこの手法で配布するのは、依存モジュールの数がそこまで多くなく、頻繁には更新を繰り返さないコマンドラインツールが向いていると言えます。先ほど登場したcpanmコマンドApp::cpanminusは、cpanmコマンド自体の初回インストールをこの手法で行っています

Dockerfileを配布してDockerコンテナ上で実行する

コマンドラインツールのリポジトリにDockerfileを含めておくと、Dockerを導入済みの環境でコマンドラインツールを利用しやすくなります。Dockerfileは、Perlのコンテナイメージをベースに依存モジュールをあらかじめインストールする内容になります。一例を示します。

Dockerfile
FROM perl:5.24.0

WORKDIR /app

COPY cmd.pl cpanfile lib /app/

RUN cpanm --installdeps .

CMD ./cmd.pl

実際に利用する場合、次のような実行手順になります。

リポジトリをローカルにクローンする
$ git clone [email protected]:kan/command-perl.git
$ cd command-perl
Dockerイメージを作成する
$ docker build -t cmd-perl .
Dockerコンテナを起動する
$ docker run -it cmd-perl

自分でDockerイメージをビルドする場合、準備の時間や手間は、依存ライブラリを手動でインストールしてコマンドラインツールを動かす場合と大差ありません。しかし、Perlのバージョンを指定できること、依存ライブラリのインストールに必要な外部ライブラリ(libxmlなど)が存在する場合にその導入も済ませられること、WindowsやMacなどの環境ではDockerの導入さえ済んでいれば実行できることがメリットになります。さらに、作ったDockerイメージをDocker Hubに登録すれば、利用する側はdocker pulldockerrunの実行だけで済むようになります。

まとめ

今回は、Perlでコマンドラインツールを実装する際に役立つモジュールや、設計の指針になりそうな考え方について紹介してきました。みなさんがツールを作るにあたって参考になれば幸いです。

さて、次回の執筆者は石垣憲一さんで、テーマは「Perl 5.26で変わること」です。お楽しみに。

WEB+DB PRESS

本誌最新号をチェック!
WEB+DB PRESS Vol.130

2022年8月24日発売
B5判/168ページ
定価1,628円
(本体1,480円+税10%)
ISBN978-4-297-13000-8

  • 特集1
    イミュータブルデータモデルで始める
    実践データモデリング

    業務の複雑さをシンプルに表現!
  • 特集2
    いまはじめるFlutter
    iOS/Android両対応アプリを開発してみよう
  • 特集3
    作って学ぶWeb3
    ブロックチェーン、スマートコントラクト、NFT

おすすめ記事

記事・ニュース一覧