改めて、CPANいいよね！

この記事はPerl Advent Calendar 2016の12日目の記事です。昨日はytnobodyさんの「[YAPC::Hokkaido 2016 SAPPORO が楽しかったという話](http://ytnobody.net/post/154304436669/yapchokkaido-2016-sapporo-が楽しかったという話)」でした。

[吉祥寺.pm](https://kichijojipm.connpass.com)というPerlのような物のイベントをやっています、Magnolia.Kです。

先日開催した[吉祥寺.pm9](http://kichijojipm.hatenablog.com/entry/2016/12/03/203822)で、[CPAN Authorになった話のLT](https://speakerdeck.com/yuzoiwasaki/perlru-xue-shi-zu-ye-sheng-kacpan-authorninatutahua)が有ったのと、最近色々な言語を使ってみて改めてCPANいいなーって思ったので、「CPANいいよね！」って話を書きます。

## 改めて、CPANいいよね！

Perlユーザーにはおなじみの[CPAN(Comprehensive Perl Archive Network)](http://search.cpan.org)は、さまざまな人が作ったモジュールが集められたリポジトリです。

### CPANからのモジュールインストール

`cpan`や`cpanm`、`cpm`といったクライアントソフトウェアを使えば、指定したモジュールをCPANからダウンロードしてインストールできます。

例えば`JSON`モジュールをインストールしたいときは、以下のコマンドでインストールします。

`$ cpan JSON`

### CPANのサイト

CPANには、サイトが二つ有り、オリジナルのCPANと、さまざまなメタデータや、アクセス用APIが整備されたmetacpanが有ります。

- [http://search.cpan.org](http://search.cpan.org)
- [https://metacpan.org](https://metacpan.org)

今回は、このmetacpanを中心に紹介します。

## metacpanのいいところ

- モジュールの使い方がシュっと分かる構成になっている

![jpg.png](https://qiita-image-store.s3.amazonaws.com/0/50035/053550ef-eac4-e0db-8ed0-36d05ed600f1.png)

metajsonでモジュールを検索すると、podの内容をパースして自動的に目次(Contents)が生成されて、最初にNAME(名前)と、SYNOPSIS(モジュールの簡単な使い方)へのリンクが表示されます。

![json.png](https://qiita-image-store.s3.amazonaws.com/0/50035/4425524f-bec3-95bf-956f-6dacacd5a41e.png)

NAMEにはモジュール名と、短いモジュールの解説が書かれています。Synopsisには、基本的なモジュールの使い方が書かれています。ここだけ見るとモジュールの目的と最低限の使い方が分かるようにまとまっています。

あと、モジュール名の前にモジュールの作者の名前が表示されるところが、凄く良いですね！

- CPAN Testersで自分の環境で使えるモジュールか調べられる

Perlはさまざまな環境で動作する言語ですが(Linuxとか、macOSとか、BSDとか、Windowsとか…)、必ずしも全てのモジュールがすべての環境で動作するとは限りません。

そんなときは左側の「Testers」をクリックすると、CPAN Testersの結果が分かります。Perlのバージョンと、各OSのマトリクスになっていて、そのモジュールの、そのバージョンがどの環境でテストされているかが一目瞭然です。


![cpantesters.png](https://qiita-image-store.s3.amazonaws.com/0/50035/86a3a328-f418-13bc-968c-7724357001ab.png)


CPAN Testersは有志が自分の環境で試した結果をアップするもので、動作保証をするものではありませんが、十分参考になります(当然テストコードが十分に書かれていることが条件ですが…）

- CPANTSによる品質保証

直接モジュールを利用する側からすればあまり関係ないのですが、CPANにはCPANTSという仕組みが有り、「READMEやChangesといった基本的なドキュメントが用意されているか？」「モジュールに適切なバージョンが付与されているか？」といった、モジュール利用者が使いやすい状態になっていることをチェックできるようになっていて、結果はスコアリングされます。

![cpants.png](https://qiita-image-store.s3.amazonaws.com/0/50035/5f0d603f-6d5e-5a19-5872-7e294bca3412.png)

CPANTSのチェック観点は、以下のサイトで確認することができます。

[http://cpants.cpanauthors.org/kwalitee](http://cpants.cpanauthors.org/kwalitee)

コアスコアが100点になっているモジュールを使った方が良いでしょう。

- さまざまなClient Software

元々CPANへアクセスするためのClient Softwareは`cpan`コマンドが定番で、その後`cpanp`といったツールが出てきましたが、今では`cpanm`が定番になっています。

一方でWebアプリケーションフレームワークのように大量のモジュールに依存しているモジュールをインストールするときに、時間がかかりすぎることからskajiさん作成の`cpm`といった新しいツールも登場しています。

[https://github.com/skaji/cpm](https://github.com/skaji/cpm)

- APIが整備されている

通常はWeb Siteか、CPAN Clientを使ってアクセスすることになりますが、metacpanではAPIも整備されていて、さまざまな情報を取得できます。CPAN Clientも結局はこれらのAPIを使ってモジュールの検索やダウンロードを行っています。

[https://github.com/metacpan/metacpan-api/blob/master/docs/API-docs.md](https://github.com/metacpan/metacpan-api/blob/master/docs/API-docs.md)

- Acmeモジュール

実はCPANの最大の魅力ではないか？と言われているのが一連のAcmeモジュールです。Acmeとは「極致, 絶頂, 最高の出来栄え」といった意味合いですが、CPANでは実用性の無い、お遊びのようなモジュールのためのネームスペースとして用意されています。

CPANで「Acme」で検索するとさまざまな不思議なモジュールが出てきますが、詳しくは[「Acme大全」](http://www.donzoko.net/gakuya/)を読んだ方が良いでしょう。

### 最近の言語には中央リポジトリは…無い?

最近の言語では、直接GitHubのリポジトリを参照することも多くなってきて、あまり中央リポジトリ！という感じで情報がまとまっていることも無くなってきて寂しいのですが、Perlのこういった文化はいいですね！

JVMのMaven Centralもごちゃっとファイルが置かれているだけだし、goはGitHubのリポジトリを参照する形式だし、Perl6は単なるディレクトリリストだし。ちょっと寂しいですね。

## おわりに

ということでとても素敵なCPANについて改めて、「こんなところが良いよね？」ということを書きました。

英語ということも有り、あまり細かくチェックする機会が無かった人も片っ端からリンクをクリックしてみて下さい。きっと新しい発見が有ると思います。

CPAN Moduleを書いてみよう！と思った人は手始めにAcmeモジュールを書いてみるところから始めると良いと思います(Acme大全に載るというメリットも？？)。

CPAN Authorになるための手順を書き出すと長くなるのでは、それは各自ググったりしてね！