Perl Hackers Hub

第65回 依存モジュールの更新 ―update-cpanfile,GitHub Actionsで実現!(2)

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

前回の(1)こちらから。

継続的な更新

モジュールの更新は一度やったら終わりではなく,継続的に行うべきものです。新しいモジュールがリリースされるたびに繰り返し発生する作業で,管理すべきモジュールの数はアプリケーションの機能追加や規模増大とともに増えていきます。こうした繰り返し発生する作業を自動化することで,将来にわたって時間と手間を節約し,煩雑な手順を手作業で行うことによるミスを減らせることが期待できます。

Node.jsやGo,Dockerなどを使って開発している場合は,RenovateDependabotなどのツールを使うと,これらのツールのbotが自動的に依存モジュール更新のPull Requestを送ってくれるので,手間を軽減できます。Perlを使って開発している場合も,update-cpanfileという筆者が開発しているPerl製のCLICommand Line Interfaceツールを使ってcpanfileの継続的な更新を実現できます。update-cpanfileは,cpanfileを書き換え,モジュールの要求を最新化する機能を持っています。

以降では,update-cpanfileを使った更新手順を紹介します。

update-cpanfileでcpanfileを更新する

まずはupdate-cpanfileをインストールします。執筆時点ではバージョン1.0.0がインストールされます。

$ cpanm App::UpdateCpanfile

依存関係を固定して扱いやすくする

cpanfileにバージョン指定を書いていない場合,carton installするタイミングで最新のバージョンがインストールされるため,実行するタイミングによって結果が不定となります。このことは,バージョン管理や継続的な更新と相性が悪いため,update-cpanfileを使い始める際には,まずは依存関係を固定します。

pinコマンドは,cpanfile.snapshotに記録されているモジュールのバージョンをcpanfileに書き戻すコマンドです。冒頭のcpanfileに対してupdate-cpanfile pinを実行すると,3つのモジュールのバージョンが固定されます。

依存モジュールの固定
$ update-cpanfile pin
Pinned 3 modules
- JSON::XS 3.0
- List::MoreUtils 0.419
- Test::More 0.98

cpanfileを確認すると,ファイルが書き換わっていることを確認できます。3つのモジュールが==を使った指定となり,cpanfile.snapshotに記録されていたバージョンに固定され,将来にわたってインストール結果が不変なものとなります。DateTimeはもともと1.50でバージョンが固定されているため,ここでは差分が出ません。

依存モジュールのバージョンが固定された
requires 'List::MoreUtils', '== 0.419';
requires 'DateTime', '== 1.50';
requires 'JSON::XS', '== 3.0';

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

依存関係を更新する

updateコマンドは,cpanfileでのバージョン要求指定を,CPANの最新版へと更新するコマンドです。update-cpanfile updateを実行すると,cpanfileでの4つのモジュールのバージョン指定が最新化されます。

依存モジュールの最新化
$ update-cpanfile update
Updated 4 modules
- DateTime 1.52
- JSON::XS 4.02
- List::MoreUtils 0.428
- Test::More 1.302181

cpanfileを確認すると,4つのモジュールすべてがCPANで公開されている最新のバージョンへと書き換えられています。

依存モジュールのバージョンが更新された
requires 'List::MoreUtils', '== 0.428';
requires 'DateTime', '== 1.52';
requires 'JSON::XS', '== 4.02';

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

この時点では要求を新しくしただけで,新しいモジュールはインストールされていないことに注意してください。carton installを実行すると,新しいモジュールがインストールされ,cpanfile.snapshotが更新されます。

著者プロフィール

hitode909

株式会社はてな所属。ブログサービスやマンガサービスの開発に携わる。

趣味はサウナ。京都中の銭湯を巡り,サウナのために旅行に出かける。

GitHub:hitode909
URL:https://blog.sushi.money/