この記事はPerl 5 Advent Calendar 2016の9日目です。
昨日はnqounetさんによる、「遅延実行と仮実行(dry_run)について考えてみた」でした。
今日は僕が開発しているCPANモジュールインストーラcpmを紹介したいと思います。
cpmとは
CPANモジュールインストーラといえば、cpanmが世界的に有名でたくさんの方が使っていると思います。
僕自身もcpanmを本当によく使っていますが、大量の依存があるアプリケーションを開発しているときなどcpanmだとCPANモジュールインストールにかなりの時間がかかり、もう少し早くならないかと思っていました。
そこでcpmを作りました。cpmは内部でcpanmを並列に使ってCPANモジュールインストールを高速に行います。
さて、速さを求めて作った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 でサーバレスなジョブシステムを作るです!