Perl Hackers Hub

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

この記事を読むのに必要な時間:およそ 1.5 分

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

利用と配布

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

リポジトリをローカルにクローンする

$ git clone git@github.com: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 git@github.com: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.101

2017年10月24日発売
B5判/160ページ
定価(本体1,480円+税)
ISBN978-4-7741-9239-0

  • 特集1
    [開発者待望の新機能の数々!]iOS 11最前線
    Swift 4,Xcode 9,機械学習,AR
  • 特集2
    [3年ぶりのメジャーリリース!]Java 9集中講座
    新機能,モジュール化,付属ツールの刷新
  • 特集3
    現場で使うSlack
    チーム開発,サービス連携,Slack App

コメント

コメントの記入