コンテンツにスキップ

Perl

plenv で perl を管理する

Perl をバージョンごと、あるいはプロジェクトごとに管理するためのツールである plenv の導入手順メモ

plenv をインストールする

homebrew の update

$ brew update
Updated Homebrew from c0fae05 to bfe20af.
No changes to formulae.

先ほど rbenv をインストールする手順 で同じことをやったばかりなので更新なし

plenv と perl-build のインストール

これも どこか で見たような手順

perl-buildplenv のプラグイン

$ brew install plenv perl-build
==> Downloading https://github.com/tokuhirom/plenv/archive/2.2.0.tar.gz
==> Downloading from https://codeload.github.com/tokuhirom/plenv/tar.gz/2.2.0
...

plenv init

$ echo 'eval "$(plenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile

plenv init - でやっていることは以下の通り

$ plenv init -
export PATH="/Your/Home/Directory/.plenv/shims:${PATH}"
export PLENV_SHELL=bash
source '/usr/local/Cellar/plenv/2.2.0/libexec/../completions/plenv.bash'

plenv() {
  local command

  command="$1"
  if [ "$#" -gt 0 ]; then
    shift
  fi

  case "$command" in
  rehash|shell)
    eval "`plenv "sh-$command" "$@"`";;
  *)
    command plenv "$command" "$@";;
  esac
}

perl のインストール

インストールできる perl のバージョンを確認

$ plenv install -l
Available versions:
 5.6.0
 5.6.1-TRIAL1
 5.6.1-TRIAL2
...

最新の安定版であるバージョン 5.22.1 をインストールする

$ plenv install 5.22.1
Installing 5.22.1 as 5.22.1
...

インストールされたバージョンを確認

$ plenv versions
* system (set by /My/Home/Directory/.plenv/version)
  5.22.1

使用する perl を設定

$ plenv global 5.22.1
$ plenv versions
  system
* 5.22.1 (set by /My/Home/Directory/.plenv/version)

perl に cpanm をインストールする

現在使用している perl に cpanm をインストールする

$ plenv install-cpanm
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   314    0   314    0     0   2078      0 --:--:-- --:--:-- --:--:--  2079
100  296k  100  296k    0     0   367k      0 --:--:-- --:--:-- --:--:-- 2135k
...

cpanm のパスが変わっていることを確認

$ which cpanm
/My/Home/Directory/.plenv/shims/cpanm

参照

minil を使った Changes ファイルの更新

CPAN モジュールの bug fix を行ったので修正版をリリース。

minil 様様と思いながら minil release コマンドを打つのだが、 いつも Changes ファイルの更新のところで、どこに何を書けば良いのだっけ?となってしまうのでここにメモしておくことにした。

{{$NEXT}} の下に書く

今回のリリースだとこうなった

Revision history for Perl extension JSON-MergePatch

{\{$NEXT}}

    - (bug fix) diff() :when the same hash-refs are present in the hash values of source and target (thanks bessarabov)
    - refactoring

0.02 2015-09-13T09:08:20Z

    - use JSON::MaybeXS and fix keys arg

0.01 2015-07-02T18:29:20Z

    - original version

{{$NEXT}} となっているところにバージョンやら日付やらが入る。

参照

Minilla チュートリアルドキュメント

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 へ公開する際の手順を書こうと思います。

参照

Replyを試してみる

Perl の REPL 環境である Reply というツールを教えてもらったので使ってみます。

REPL とは?

REPL とは Read-Eval-Print Loop の頭文字を取った言葉であり、

プログラムを読み(Read)、評価し(Evaluate)、結果を出力(Print)することを繰り返す(Loop)という意味である。

この環境があればファイルにプログラムを書いて保存し、実行する、という手続きを踏まなくてもスクリプトを実行できる

この REPL の Perl 版が Reply と言うことだそう

Reply のインストール

Reply は CPAN からインストールする

$ cpanm Reply
--> Working on Reply
Fetching http://cpan.metacpan.org/authors/id/D/DO/DOY/Reply-0.37.tar.gz ... OK
Configuring Reply-0.37 ... OK
...

インストールできたら早速実行してみる

$ reply
/Users/sojiro/.replyrc not found. Generating a default...
0> 

コンソールが立ち上がった

早速なにかプログラムを入力してみよう

0> print 'Hello Reply';
Hello Reply$res[0] = 1
1> 12 * 12
$res[1] = 144

なるほど単純なプログラムの動作が確認できた。今度は use してみる。

2> use UUID::Tiny;
3> my $id = create_UUID_as_string(UUID_V4);
$res[2] = '87b16a6b-c712-41b4-bf46-965eeb01d3f1'

4> print $id;
87b16a6b-c712-41b4-bf46-965eeb01d3f1$res[3] = 1

このように実行結果は記憶された状態で進むので簡単にプログラムの実行結果を知りたいときに重宝しそうである。

参照