読者です 読者をやめる 読者になる 読者になる

はむはむエンジニアぶろぐ

このブログのコンセプトは"ハッキングの為なら愛する家族を傷つけることをいとわない" 自分にとってエンジニアリングは "手段ではなく生きる目的" である

Perlのモジュール管理にはCartonを使おう

f:id:secret_hamuhamu:20150426020452p:plain
今回は、Cartonを使ったモジュール管理の仕方を覚える。
RubyでいうBundlerです。
簡単にモジュールのインストールと管理ができるツールです。

環境構成

  • Perl 5.18
  • cpanm 1.7033
  • Carton v1.0.21


何故、モジュール管理が必要なのか?

例えば、昨日インストールしたモジュール(仮に X とします)を今日インストール(仮に X' とします)するとバージョンアップされていたとします。
その際、昨日コーディングした X を使ったコードが、 X' だと動かない可能性があります。
動かない原因は、インターフェースが変わっていたりなど理由は様々です。

dev(開発)環境と、本番環境が分かれている際など、モジュール管理してないとたまにトラブったりします。 dev環境でモジュールをインストールしてシステムを開発し、本番環境でモジュールをインストールしデプロイ。
dev環境で、インストールしてから本番環境にインストールするまでの間に、モジュールがバージョンアップしてしまう可能性があります。

それらの問題を解決するためにモジュール管理が必要です。

Cartonを使えば、システムを動作するために必要なモジュール管理情報をひとまとめにできて、バックアップをとっておけば万一の際に備えることが出来ます。

Cartonで出来る事

Perlのモジュールをインストールする際、 cpan または cpanm を扱うと思います。
それらのコマンドが何をしているかというと、メタデータ(インストール手順書)をビルドしてテストしてインストールということをしています。

Cartonは、cpanコマンドらと同じくモジュールのインストールが出来ますが、 cpanfile と呼ばれるDSLにインストールしたいモジュールを記述してインストールします。
そうすることで、 cpanfile.snapshot と、というインストール時のスナップショットを残すことが出来ます。
このスナップショットをもとに、モジュールをインストールできるので異なる環境でも同じ手順でインストール作業が行えます。


Cartonを使わずにcpanmでモジュール管理をしようとすると、これらのコマンドをどこかにバックアップをとっておく必要があります。

cpanm DBI@1.625
cpanm Plack@0.9980

とても、手動で管理するのは大変なのがわかります。


他には、コンポーネント単位で独立してインストールといったことが出来ます。
新しく機能を追加する際は、古いライブラリに引っ張られなくて済むということですね。


Cartonをインストール

Cartonをインストールするには、cpanmを使います。
cpanmのインストールは割愛。

cpanm Carton

たったこれだけ。

cpanfileについて

すごく適当だけど、cpanfileの書き方。
フェーズという概念があり、テスト環境ならこのモジュールが必要、開発環境でのみこのモジュールが必要といった事もできますが割愛。

  • cpanfile
requires 'Plack', '0.9980';
requires 'Starman', '0.2000';
requires 'DBI';

cpanfileをもとにCartonでインストール

carton install

すると、ザクザクっとインストールされていきます。
この時点で、cpanfile.snapshotが作成されます。


※ cpanfileは、dev環境でのみ使用します。
本番環境は、cpanfileを使わずにインストール時のスナップショットであるcpanfile.snapshotを使います。

インストールすると、cpanfileと同じ階層に local というディレクトリが作成されます。
local/lib/perl5 以下にモジュールがインストールされることになります。


インストール先を変更したい場合は、オプション --path を付けます。

carton install --path=hoge

cpanfile.snapshotについて

dev環境で作成したcpanfile.snapshotを用いてモジュールをインストールします。
注意しなければいけないことが、cpanfile.snapshotは手動で変更を加えてはいけないこと。
これを書き換えてしまうと、cpanfileと整合性がつかなくなります。

それから、cpanfileは、本番環境に持ってこないほうがいいでしょう。
あやまってcpanfileをもとにモジュールをインストールしてしまうリスクがあるので、本番環境はcpanfile.snapshotのみ配置します。


cpanfile.snapshotをもとにモジュールをインストールする。

carton install --deployment


まとめ

Cartonを使えば、モジュール管理することが出来る。
他にもCartonを使って細かに設定できることがある。

最近読んだ本

続・初めてのPerl 改訂第2版

続・初めてのPerl 改訂第2版

Perl徹底攻略 (WEB+DB PRESS plus)

Perl徹底攻略 (WEB+DB PRESS plus)

Perlベストプラクティス

Perlベストプラクティス

モダンPerl入門 (CodeZine BOOKS)

モダンPerl入門 (CodeZine BOOKS)