cpm - a fast CPAN module installer

  • 7
    いいね
  • 0
    コメント

この記事はPerl 5 Advent Calendar 2016の9日目です。

昨日はnqounetさんによる、「遅延実行と仮実行(dry_run)について考えてみた」でした。

今日は僕が開発しているCPANモジュールインストーラcpmを紹介したいと思います。

cpmとは

CPANモジュールインストーラといえば、cpanmが世界的に有名でたくさんの方が使っていると思います。

僕自身もcpanmを本当によく使っていますが、大量の依存があるアプリケーションを開発しているときなどcpanmだとCPANモジュールインストールにかなりの時間がかかり、もう少し早くならないかと思っていました。

そこでcpmを作りました。cpmは内部でcpanmを並列に使ってCPANモジュールインストールを高速に行います。

cpm-Plack.gif

さて、速さを求めて作ったcpmですが、最近いくつか他の機能も追加したので
今日はその紹介したいと思います。

darkpanとの連携

darkpanとはCPANの全部、もしくは一部分のミラーを指します。OrePAN2, CPAN::Miniなどを使うと比較的簡単に作ることができます。

このdarkpanからのモジュールインストールにcpmは対応しています。

例えば/opt/darkpanにdarkpanがあるとき

> cpm install --resolver 02packages,/opt/darkpan Your::Module

とすれば/opt/darkpanからYour::Moduleをインストールします。

なお、この書き方だと/opt/darkpan のみ からYour::Moduleをインストールしようとします。もし/opt/darkpanは一部分のミラーであるため、存在しないモジュールはMetaDBにfallbackして探して欲しい場合は、

> cpm install --resolver 02package,/opt/darkpan --resolver metadb Your::Module

としてください。

依存モジュールをgitからインストール

上記darkpanを使えば、社内専用モジュールも管理できるようになるでしょう。ただモジュールをgithubで管理してある場合は、そこから直接インストールできるとさらに便利かもしれません。

そのような場合は

requires "Your::WebApp", git => "git://github.com/you/Your-WebApp.git", ref => "develop";
requires "Plack", ">= 1.000, < 2.000";

というcpanfileを準備して

> cpm install

とすればgithubから直接インストールできます。

なお、この機能はcapnm/Cartonにも一時あったのですが、現在は削除されています。ほかのtoolchainとの連携を考えるとき、この「CPAN以外のディストリビューション保存場所」をどう扱っていくかは、議論があります。

resolverが柔軟

さて上記2つの特徴に代表されるように、cpmはresolver =「モジュール名からディストリビューション保存場所を取得」のところが柔軟にできています。
実際、それらはApp::cpm::Resolver::*の名前空間の下にまとまっており、
容易に変更可能にしてあります。

今後、これをユーザが簡単に変更できるインタフェースを用意したいと思っています。

今後

以上cpmの特徴について説明してきました。

さてすでにいくつかのCPANモジュールインストーラが存在するとき、cpmの存在意義はなんでしょうか。

前述したとおりcpanmは安定したCPANモジュールインストーラであり世界中で使われています。したがって大幅な内部変更、新規機能の追加にはすこし慎重にならざるを得ません。
そこでcpmです。すなわちcpmをsandboxとしてとらえ、何の機能は役に立ち、何の機能は意味がないのかを見極めたいと思っています。

実際、まだまだ試したいことがたくさんあります。もしもみなさんの中にCPANモジュールインストーラに不満を持っている方、新たな機能の提案を持っている方がいましたら、ぜひ議論したいなと思います。

さて明日はytnobodyさんでAzure + Perl でサーバレスなジョブシステムを作るです!