コンテンツにスキップ

CPAN

CPAN モジュールのリリース

上司にお膳立てされ、後輩にお尻を叩かれ、やっとのことで CPAN モジュールをリリースしました。

前回のエントリに続き、リリースの手順を記します。

モジュールの作成

ここがコアの部分ですが、内容は作るモジュールに依るので割愛。編集すべきは以下のファイルです。

  • lib/ 配下のプログラム
  • t/ 配下のテストプラグラム
  • cpanfile

cpanfile の作成は scan-prereqs-cpanfile を使うと便利です。

このコマンドは App::scan_prereqs_cpanfile モジュールで提供されています。

cpanm App::scan_prereqs_cpanfile
scan-prereqs-cpanfile > cpanfile

テスト

モジュールの作成ができたら test を実行しますが、このとき minil test コマンドを使うと Changes や META.json、README.md が自動で編集されます。

$ minil test
Creating working directory: /user/home_directory/git/cpan/JSON-MergePatch/.build/5DuYQ9x7
cp Build.PL /user/home_directory/git/cpan/JSON-MergePatch/.build/5DuYQ9x7/Build.PL
cp Changes /user/home_directory/git/cpan/JSON-MergePatch/.build/5DuYQ9x7/Changes
cp LICENSE /user/home_directory/git/cpan/JSON-MergePatch/.build/5DuYQ9x7/LICENSE
cp META.json /user/home_directory/git/cpan/JSON-MergePatch/.build/5DuYQ9x7/META.json
cp README.md /user/home_directory/git/cpan/JSON-MergePatch/.build/5DuYQ9x7/README.md
cp cpanfile /user/home_directory/git/cpan/JSON-MergePatch/.build/5DuYQ9x7/cpanfile
cp lib/JSON/MergePatch.pm /user/home_directory/git/cpan/JSON-MergePatch/.build/5DuYQ9x7/lib/JSON/MergePatch.pm
cp minil.toml /user/home_directory/git/cpan/JSON-MergePatch/.build/5DuYQ9x7/minil.toml
cp t/00_compile.t /user/home_directory/git/cpan/JSON-MergePatch/.build/5DuYQ9x7/t/00_compile.t
Building /user/home_directory/git/cpan/JSON-MergePatch/.build/5DuYQ9x7
Retrieving meta data from lib/JSON/MergePatch.pm.
Name: JSON::MergePatch
Abstract: It's new $module
Version: 0.01
fatal: bad default revision 'HEAD'
Writing MANIFEST file
Writing release tests: xt/minilla/minimum_version.t
Writing release tests: xt/minilla/cpan_meta.t
Writing release tests: xt/minilla/pod.t
Writing release tests: xt/minilla/spelling.t
Writing release tests: xt/minilla/permissions.t
[5DuYQ9x7] $ perl -I. Build.PL
Creating new 'Build' script for 'JSON-MergePatch' version '0.01'
[5DuYQ9x7] $ perl -I. Build build
cp lib/JSON/MergePatch.pm blib/lib/JSON/MergePatch.pm
t/00_compile.t .. ok   
All tests successful.
Files=1, Tests=1,  0 wallclock secs ( 0.01 usr  0.01 sys +  0.03 cusr  0.01 csys =  0.06 CPU)
Result: PASS
Removing /user/home_directory/git/cpan/JSON-MergePatch/.build/5DuYQ9x7

リリース

テストが通ったらいよいよリリースします。

CPAN へのリリースには PAUSE ID が必要です。取得方法はこちら

リリースには minil release コマンドを使います。

$ minil release

Release engineering requires Version::Next, but it is not available. Please install Version::Next using your preferred CPAN client at ...

Version::Next がないと怒られたので入れて再度実行。

$ cpanm Version::Next
...

$ minil release

Release engineering requires CPAN::Uploader, but it is not available. Please install CPAN::Uploader using your preferred CPAN client at ...

今度は CPAN::Uploader がないと怒られたので入れて再度実行。

$ cpanm CPAN::Uploader
...

$ minil release

Retrieving meta data from lib/JSON/MergePatch.pm.
Name: JSON::MergePatch
Abstract: JSON Merge Patch implementation
Version: 0.01
Next Release? [0.01] 
Name: JSON::MergePatch
Abstract: JSON Merge Patch implementation
Version: 0.01
...
All tests successful.
Files=8, Tests=67,  0 wallclock secs ( 0.04 usr  0.03 sys +  0.18 cusr  0.04 csys =  0.29 CPU)
Result: PASS
Wrote JSON-MergePatch-0.01.tar.gz
Upload to CPAN
Release to CPAN ? [y/n]   y
missing user argument at

リリースバージョンの確認と、 CPAN にリリースするかの確認に答えていざリリース、と思いきや

missing user argument at

と怒られました。

どうやら ~/.pause ファイルに PAUSE のユーザー情報を記載する必要があるようです。

$ vim ~/.pause
$ cat ~/.pause
user SOJIRO
password your_password

再度実行

$ minil release

Retrieving meta data from lib/JSON/MergePatch.pm.
Name: JSON::MergePatch
Abstract: JSON Merge Patch implementation
Version: 0.01
Next Release? [0.01] 
Name: JSON::MergePatch
Abstract: JSON Merge Patch implementation
Version: 0.01
...
All tests successful.
Files=8, Tests=67,  0 wallclock secs ( 0.04 usr  0.03 sys +  0.18 cusr  0.05 csys =  0.30 CPU)
Result: PASS
Wrote JSON-MergePatch-0.01.tar.gz
Upload to CPAN
Release to CPAN ? [y/n]   y
registering upload with PAUSE web server
POSTing upload for /user/home_directory/git/cpan/JSON-MergePatch/.build/ilpDOKuE/JSON-MergePatch-0.01.tar.gz to https://pause.perl.org/pause/authenquery
PAUSE add message sent ok [200]
Name: JSON::MergePatch
Abstract: JSON Merge Patch implementation
Version: 0.01
[JSON-MergePatch] $ git commit -a -m Checking in changes prior to tagging of version 0.01.
Changelog diff is:
diff --git a/Changes b/Changes
index 643c7bc..dae7daa 100644
--- a/Changes
+++ b/Changes
@@ -2,5 +2,7 @@ Revision history for Perl extension JSON-MergePatch

 {{$NEXT}}

+0.01 2015-07-02T18:29:20Z
+
     - original version

[master 3bf0db2] Checking in changes prior to tagging of version 0.01.

 2 files changed, 17 insertions(+), 1 deletion(-)
Pushing to origin
[JSON-MergePatch] $ git push origin master
Counting objects: 7, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 831 bytes | 0 bytes/s, done.
Total 4 (delta 2), reused 0 (delta 0)
To git@github.com:sojiro14/JSON-MergePatch.git

   9c8c207..3bf0db2  master -> master

[JSON-MergePatch] $ git tag 0.01
[JSON-MergePatch] $ git push origin tag 0.01
Total 0 (delta 0), reused 0 (delta 0)
To git@github.com:sojiro14/JSON-MergePatch.git

 * [new tag]         0.01 -> 0.01

Removing /user/home_directory/git/cpan/JSON-MergePatch/.build/ilpDOKuE

テストが実行された後、CPAN にリリースされました。最後にその時点の tag が切られて完了。

ついに CPAN モジュールをリリースしてしまいました。メンテナンスちゃんとしなくては。

参照

CPAN モジュールのための雛形を作る

いよいよ CPAN モジュールを作ろうと思います。

しかし既存の CPAN モジュールを見てみると本体のプログラムの他に見慣れないファイルがちらほら。。。

正直どんなファイル群で CPAN モジュールを構成すれば良いのか分かっていないわけです。

そんな悩みを解決してくれたのが Minilla モジュールです。

Minilla のインストール

Minilla は CPAN モジュールなので cpanm コマンドでインストールできます。

$ cpanm Minilla
--> Working on Minilla
Fetching http://cpan.metacpan.org/authors/id/T/TO/TOKUHIROM/Minilla-v2.4.1.tar.gz ... OK
Configuring Minilla-v2.4.1 ... OK
...
Building and testing Minilla-v2.4.1 ... OK
Successfully installed Minilla-v2.4.1
11 distributions installed

雛形の作成

Minilla がインストールできたら早速 CPAN モジュールの雛形を作ります。 minil new Your::Module で作成できます。

今回は JSON::MergePatch というモジュールを作ります。

$cd ~/git/cpan
$ minil new JSON::MergePatch
Writing lib/JSON/MergePatch.pm
Writing Changes
Writing t/00_compile.t
Writing .travis.yml
Writing .gitignore
Writing LICENSE
Writing cpanfile
Initializing git JSON::MergePatch
[JSON-MergePatch] $ git init
Initialized empty Git repository in /user/home_directory/git/cpan/JSON-MergePatch/.git/
Retrieving meta data from lib/JSON/MergePatch.pm.
Name: JSON::MergePatch
Abstract: It's new $module
Version: 0.01
fatal: bad default revision 'HEAD'
[JSON-MergePatch] $ git add .
Finished to create JSON::MergePatch

これで雛形ができました。

そしてこれから雛形を編集していくわけですが、自分で編集するのは基本的に以下のファイルのみです。

  • lib/ 配下のプログラム
  • t/ 配下のテストプラグラム
  • cpanfile

以下のファイルはそれぞれ minil hoge コマンド実行時に自動で編集されます。

  • Changes: リリース時に更新される
  • META.json: cpanfile に合わせて更新される
  • README.md: lib/Your/Module.pm の記述から更新される

つづく

次回はいよいよ CPAN へ公開する際の手順を書こうと思います。

参照

PAUSE ID の取得

いま私は日本の Perl シーンにおける名立たるプログラマの方々の元で仕事させていただくという大変ありがたい立場にいるのですが、常々

** OSS に対する活動が成長の大きな糧になるからチャレンジすべし **

とアドバイスを受けています。

ところが初めてその言葉を受けてから既に1年以上経とうというのに何もしていない。これは本当にいかんと思ってとにかく CAPN に貢献してみようと。

そこで調べてみると PAUSE ID なるものが必要なようなので取得までの過程をここへメモします

PAUSE ID の取得

PAUSE は The Perl Authors Upload Server の略称で、ここから CPAN へのアップなどするよう

ここ から登録を開始する

各項目に入力してアカウント申請を行う

full name の欄はそれっぽい名前じゃないとはじかれるが、後から変えられる

申請を行うと、しばらくしてアカウント発行の通知が登録したメールアドレスに届く

この通知は人によって届くまでの時間にばらつきがあるようだが、今回は申請したその日のうちに来た

通知にはパスワード変更ページへのリンクと暫定のパスワードが記載されているので、登録した ID と暫定パスワードで Basic 認証を突破してパスワードを設定する

アカウントが発行されると Edit Account Info というメニューへアクセスできるようになる

ここに

The email address [id]@cpan.org should be configured to forward mail to ...

という項目があるので、 [id]@cpan.org へのメールを受け取るメールアドレスを設定する

ここで設定しておかないと後々 [id]@cpan.org に対するメールが受け取れず不便を被るので要設定とのこと

Gravatar の設定

Gravatar は Email アカウントにアイコンを紐づけて様々なサービスで使えるようにするサービスで、 GitHub などでも使われている

https://ja.gravatar.com/

Gravatar に PAUSE ID に紐づいたアドレスでアイコンを設定することで CPAN のアカウントへアイコンを設定することができる

[id]@cpan.org  # 設定するメールアドレス

既に Gravatar のアカウントがある場合は「メールアドレスの追加」から上記アドレスを追加すればよい

新たに Gravatar のアカウントを取得する場合は注意が必要なようである。 @cpan.org のメールアドレスが前項の PAUSE ID 取得の際に自分のメールアドレスへ転送されるよう設定してからでないと、メールアドレスの認証が取れず、 Gravatar のアカウント取得に失敗するようだ。

{% img /images/cpan/gravatar.png %}

Gravatar の設定が済むと PAUSE アカウントに設定したアイコンが表示されるようになる

{% img /images/cpan/sojiro.png %}

さて、アカウントは取得した。後はコードを書いて上げるだけ。

やるしかないのです。

参照