Perl

Minilla で Perl モジュールをつくる

More than 3 years have passed since last update.

Minilla で Perl モジュールを開発するための環境構築から、実際にモジュールを作ってテストするまでをやってみました。

ライブラリをインストールする場所

以後、環境構築で必要になる実行プログラムやライブラリをインストールするディレクトリが $PERL5_LOCAL_LIB_HOME で参照できるものとします。今回は、$HOME/Developer/Library/Perl としました。

PERL5_LOCAL_LIB_HOME=$HOME/Developer/Library/Perl

また、実行プログラムをインストールする $PERL5_LOCAL_LIB_HOME/bin$PATH に追加しておきます。

export PATH="PERL5_LOCAL_LIB_HOME/bin:$PATH"

cpanm のインストール

CPAN で公開されているライブラリのインストールには、コマンドラインツールの cpanm を使うのが便利です。cpanm 自体は、いくつかの方法でインストールできます(それぞれの手順については公式のドキュメントを参照)。

  1. OS のパッケージ管理ツール (apt-get など)
  2. 最新の cpanm をダウンロード、実行して cpanm をインストール
  3. スタンドアローンなプログラムをダウンロード

たとえば、3 の方法だと:

% mkdir -p $PERL5_LOCAL_LIB_HOME/bin; cd $PERL5_LOCAL_LIB_HOME/bin
% curl -LO http://xrl.us/cpanm
% chmod u+x cpanm

だけで、cpanm コマンドラインツールを利用できるようになります。

local::lib

Minilla に関連するライブラリが $PERL5_LOCAL_LIB_HOME にインストールされるように、local::lib をセットアップしておきましょう。

% cpanm --local-lib $PERL5_LOCAL_LIB_HOME local::lib

local::lib を use して perl を実行することで、適切な環境変数が出力されることを確認します。

% perl -I$PERL5_LOCAL_LIB_HOME/lib/perl5 -Mlocal::lib=$PERL5_LOCAL_LIB_HOME
PATH="$HOME/Developer/Library/Perl/bin${PATH+:}$PATH"; export PATH;
PERL5LIB="$HOME/Developer/Library/Perl/lib/perl5${PERL5LIB+:}$PERL5LIB"; export PERL5LIB;
...

.bashrc などに追記して、シェルの起動時に環境変数が設定されるようにします。

[ $SHLVL -eq 1 ] && eval "$(perl -I$PERL5_LOCAL_LIB_HOME/lib/perl5 -Mlocal::lib=$PERL5_LOCAL_LIB_HOME)"

Minilla のインストール

Minilla のインストールも、cpanm を実行するだけです(依存しているライブラリが多く、それなりに時間がかかります)。

% cpanm Minilla
--> Working on Minilla
...
Successfully installed Minilla-v0.12.0
37 distributions installed

試しに動かしてみます。

% minil -v
Minilla: v0.12.0

あとは、このへんを読みながら実際に開発を進めていきます。

プロジェクトの雛形をつくる

minil コマンドでプロジェクトの雛形を作成します。

今回は、Rails の ActiveSupport::Inflector っぽいモジュールを開発しようと思うので、名前は String-Inflector にしました。

% minil new String-Inflector
Writing lib/String/Inflector.pm
Writing Changes
Writing t/00_compile.t
Writing .travis.yml
Writing .gitignore
Writing LICENSE
Writing cpanfile
Initializing git String::Inflector
[String-Inflector] $ git init
Initialized empty Git repository in $HOME/Developer/Workspace/String-Inflector/.git/
Detecting project name from directory name.
Retrieving meta data from lib/String/Inflector.pm.
Name: String::Inflector
Abstract: It's new $module
Version: 0.01
fatal: bad default revision 'HEAD'
[String-Inflector] $ git add .
Finished to create String::Inflector

途中で fatal: bad default revision 'HEAD' という git のエラーが出ていますが、これは、コミットがないときに出る git log のエラーです。プロジェクトを作ったばかりでコミットがないのは当然なので特に問題ありません (Minilla/Issues/49)

どんなファイルが作成されているかを確認しましょう。

% cd String-Inflector
% tree
.
├── Build.PL
├── Changes
├── LICENSE
├── META.json
├── README.md
├── cpanfile
├── lib
│   └── String
│       └── Inflector.pm
├── minil.toml
└── t
    └── 00_compile.t

3 directories, 9 files

この時点で git initgit add が済んでいるので、commit もしておきます。

% git commit -m 'initial import'

依存するモジュールの追加

minil new した時点で cpanfile というファイルが作成されていますが、このファイルにはプロジェクトが依存するモジュールを記述します。

requires 'perl', '5.008001';

on 'test' => sub {
    requires 'Test::More', '0.98';
};

cpanfile の詳しい書き方は POD を参照してください。また、バージョン指定の書式については CPAN::Meta::Spec の POD が詳しいです。

cpanfile で記述した依存モジュールは、cpanm コマンドで

cpanm --installdeps .

または、Carton を使って、

carton install

でインストールできます。carton を使うと、依存モジュールがプロジェクトのディレクトリ以下にインストールされるので、管理が楽になります(Carton も cpanm Carton 一発でインストールできます)。

デフォルトからの変更

Perl バージョンの変更

デフォルトだと Perl 5.8.5 以上に対応するモジュールとしてビルドされます。変更したい場合は lib/String/Inflector.pm の use VERSION を変更します。

今回は自分の Mac にインストールされていた Perl 5.12 以降を対象にしました。

package String::Inflector;
use 5.012;

また、cpanfile にも Perl のバージョン指定があるので、こちらも変更します。

requires 'perl', '5.012';

ライセンスの変更

デフォルトだと Perl ライセンスになっています。こちらの変更もファイルは同じ lib/String/Inflector.pm ですが、POD の LICENSE セクションを変更します。

今回は、個人的な好みで MIT ライセンスを選択しました。

=head1 LICENSE

MIT License

ただし、Perl ライセンス以外を選択した場合、あとで Build.PL を生成するときに「Software::License が必要!」と怒られるので、cpanfile に追加しておきます。

on 'develop' => sub {
    requires 'Software::License'
};

開発

あとは開発するだけです。モジュールに新規コードとテストを追加し、Carton を使用している場合は carton exec でテストを実行します。

% carton exec -- prove -Ilib -r t

問題なければ git add して minil test すると、実際にビルドしてテストを実行してくれます。

まだ分からないこと

  • Carton を使って開発していても、minil test した時点で依存モジュールが $PERL5_LOCAL_LIB_HOME にインストールされてしまう
    • Minilla を cpanfile の develop フェーズに記述して、minil の実行も carton exec するようにした方がいいかも?(試してない)
  • CPAN にリリースやったことありません