前回の
CPANモジュールの作成
それでは、
モジュールの命名規則
まずはモジュールの名前を決めましょう。CPANの世界では、Text::Markdown
というように
Perlの世界はご存じのとおりTMTOWTDI
CPANモジュールにはAcme::
という階層があります。ここはジョークモジュール用の階層で、Acme::Songmu
というモジュールを作りながら、
モジュールのひな型を作成する
minil new
サブコマンドを使って、
いろいろ出力されましたが、Acme-Songmu
が作られ、git add
まで実行されました。
MinillaではGitによる管理が必須
Minillaを使ったモジュール開発では、
リモートリポジトリはGitHubを利用するのがお勧めです。あとで説明するREADME.
へのステータスバッジの表示設定など、Acme-Songmu
であれば、git remote add origin git@github.
といった具合です。
試しにテストを実行する
minil new
で作られたプロジェクトディレクトリに移動して、minil test
を実行してみましょう。minil test
はモジュールのテストスイートを実行するコマンドです。
モジュールのビルドとテストが実行され、
モジュールのディレクトリ構成を理解する
さっそく開発を進めたいところですが、
minil new
が生成したファイルをもとにCPANモジュールのディレクトリ構成を理解していきましょう。初期ファイルは次のように分類できます。
- ライセンスファイル
- LICENSE
(ライセンスファイル)
- LICENSE
- 設定ファイル
- minil.
toml (Minillaの設定ファイル)
- minil.
- 開発時に編集するファイル
- lib/
Acme/ Songmu. pm (メインのモジュールファイル) - t/
00_ compile. t (最低限のテストファイル) - cpanfile
(依存モジュールを記述するファイル) - Changes
(変更履歴を記述するファイル)
- lib/
- Minillaが自動的に更新するファイル
- Build.
PL (モジュールビルドのためのファイル) - META.
json (モジュールのメタ情報が記述されたファイル) - README.
md (ドキュメントファイル)
- Build.
順に見ていきましょう。初期生成はされない各種配置用ディレクトリについても説明します。
ライセンスファイル
LICENSE
ファイルには、
設定ファイル
minil.
はMinillaの設定ファイルです。その名のとおり、
開発時に編集するファイル
lib/
がメインのモジュールファイルです。ほかにモジュールファイルを追加したい場合は、lib
ディレクトリ以下に追加できます。
t/
は最低限のテストファイルです。今後テストファイルはtディレクトリ以下に配置します。
cpanfile
は依存モジュールを記述するためのファイルです。のちほど詳しく説明します。
Changes
はモジュールの更新履歴を記述するためのファイルです。
Minillaが自動的に更新するファイル
Build.
、META.
、README.
は、
README.
を編集できないことは奇妙に思えるかもしれませんが、README.
を自動生成するためです。こちらに関しても後述します。
コマンドラインツール配置用ディレクトリ
Perlはコマンドラインツールを簡単に作れる言語でもあるため、mini
コマンドがまさしくそれです。そういった場合、script
ディレクトリを作成し、
逆に、script
ディレクトリに配置するのは危険です。そのような作者のためのファイルはauthor
ディレクトリに配置することが規約となっています。
サンプルコード配置用ディレクトリ
サンプルコードを同梱したい場合は、examples
かeg
のどちらかに配置することが推奨されています。使い分けは好みの問題ですが、eg
を使うことが多いです。
コード以外のファイルを配置するディレクトリ
ソースコード以外のファイルをモジュールに同梱したい場合があります。たとえば、share
ディレクトリに配置します。
その場合、File::Share
などのモジュールを通してアクセスして開発する必要があります。
モジュールを開発する
それでは、lib
ディレクトリ以下にモジュールファイルを、t
ディレクトリ以下にテストファイルを配置して開発していきます。
CPANモジュール開発ならではの要件として、xt
ディレクトリにテストファイルを配置することが慣例となっています。
ドキュメントを書く
ドキュメントは、Acme::Songmu
の場合はlib/
がメインのモジュールファイルです。
このPodが、README.
を自動生成するしくみとなっているので、
Podの書き方は、perldoc perlpod
で調べられます。最初は書き慣れないかもしれませんが、
NAMEとDESCRIPTIONは単語のとおりモジュールの名前と説明です。特徴的なのはSYNOPSISで、
スペルチェックに対応する
Minillaは、
単純なスペルミスは修正すればよいですが、
- 除外単語をPod冒頭のstopwordsリージョンに記述する
- Pod上のコード片はcode text記法のC<>やC<<>>できちんと囲む
以下は、Acme::Songmu
のソースコード内から抜粋したものです。
README.mdにステータスバッジを表示する
README.
には、
MinillaはREADME.
をPodから自動生成するため、README.
を直接編集してバッジ画像表示のリンクを書き足すのは好ましくありません。その代わり、
たとえばTravis CIであれば、minil.
に次の記述を追記することで実現できます。ほかにも多くのサービスに対応しています。詳しくは、
Perlのプロジェクトを各種CIサービスと連携させる方法については、
モジュールのバージョンを記述する
メインモジュールファイル上のグローバル変数$VERSION
でバージョンを記述します。これがCPANモジュール自体のバージョンになります。Minillaの標準のひな型では、
モジュールをまだ一部環境でサポートが残っている古いPerl 5.
これは必ず1行で書かないといけません。少し冗長ですが、v.
の部分)
依存モジュールの記述と動作確認
CPANモジュールのインストールが失敗する主要な原因の一つに、
しかし、cpanfile
がデファクトスタンダードになり、
cpanfile
について詳しくは、perldoc cpanfile
もしくは、
scan-prereqs-cpanfileで簡単に依存を抽出する
cpanfile
は手で記述するのではなくソースコードから機械的に自動生成し、scan-prereqs-cpanfile
コマンドに自動生成させるのが簡単です。このコマンドは、
scan-prereqs-cpanfile
コマンドを次のように実行します。ソースコード内のuse
文などを静的に解析して依存モジュールを自動的に抽出し、cpanfile
に書き出されます。
書き出された内容を確認し、
use文に最低依存バージョンを記述する
新しい機能を使いたい場合など、cpanfile
内で明示的にそのバージョンを指定する必要があります。それも、use
文に最低依存バージョンを記述することで、scan_
に自動的に出力させられます。
たとえば、Class::Accessor::Lite::Lazy
のバージョン0.
このように記述すると、scan-prereqs-cpanfile
は次のように最低依存バージョンを含めて依存を書き出してくれます。このように積極的に最低依存バージョンを記述するのはグッドプラクティスです。
これはあくまでcpanfile
にはバージョン固定のための記法はありますが、
scan-prereqs-cpanfileで抽出できない依存
Module::Load
などのクラスローダや、scanprereqs-cpanfile
では抽出できません。これらの依存は、
なお、
必要最小限のテスト実行のためにTest::Requiresを活用する
ユーザーがCPANモジュールをインストールする場合、
たとえば、DBD::mysql
が入っているときのみMySQL関連のテストを実行するといったケースです。そういった場合はTest::Requires
というモジュールを使うのがセオリーで、
これで、DBD::mysql
がテスト実行環境に入っているときのみ実行されます。
開発者側ではTest::Requiresのテストをスキップしない
前項のTest::Requires
の振る舞いは、Test::Requires
で指定されている依存モジュールを抽出し、cpanfile
に記載できると良さそうです。
そのためのscan-prereqs-cpanfile
のオプションが、--scan-test-requires
です。たとえば先ほどのuse Test::Requires 'DBD::mysql'
が記述されたテストファイルが存在するプロジェクトに対して、scan_
を実行すると、
cpanfile
のdevelop
セクションは、cpanm
でインストールするためには、--withdevelop
を指定します。
モジュール開発者やCI環境では上記のコマンドで依存のインストールを行い、
リリース前確認を行う
これで一通りモジュールの開発が終わりました。リリース前にテストスイートを実行してみましょう。minil test --all
を実行すると、
標準のテストのほかにxt/
というMinillaが生成したモジュール検証用のテストがいくつか実行されています。これらが通れば、
<続きの
本誌最新号をチェック!
WEB+DB PRESS Vol.130
2022年8月24日発売
B5判/
定価1,628円
ISBN978-4-297-13000-8
- 特集1
イミュータブルデータモデルで始める
実践データモデリング
業務の複雑さをシンプルに表現! - 特集2
いまはじめるFlutter
iOS/Android両対応アプリを開発してみよう - 特集3
作って学ぶWeb3
ブロックチェーン、スマートコントラクト、 NFT