この記事はPerl Advent Calendar 2017の11日目の記事です。
昨日はtsucchiさんのMinion についてでした。Minionはv8からadmin uiが付属するようになったらしいので使わねばと思っていたところでした。

さて今日は、先日僕がメンテナになりリリースしたMouseとText::Xslateについて

  • なぜメンテナになりリリースしようと思ったか
  • どういう変更をしたか

を書きたいと思います。

なぜメンテナになりリリースしようと思ったか

MouseはShawn M Mooreさん作のPerl5に本格的なオブジェクト指向プログラミングを導入するものです。

Text::Xslateはgfxさん作の高速なtemplateエンジンです。

この2つのモジュールはどちらも広く使われていて、Perl5が今後も実用的な言語であるためにはなくてはならないものです。一方でオリジナルオーサーの方々はややそのモジュールへの関心が薄れ、メンテナンスが停滞気味になっていました。

これをなんとかしたいと常々思っていました。思っていても始まらないので、gfxさんに「メンテナンス権ください」と言ったところ、快くOKと言ってもらえましたので、この度、メンテナになりリリースしました。

このOSSメンテナを引き継ぐモチベーションは、buildersconでのshibataさんの発表「OSS の引き継ぎ方」が与えてくれました。ありがとうございます。

どういう変更をしたか

Perl 5.8のための修正

Devel::PPPort 3.33

https://github.com/gfx/p5-Mouse/issues/63

Devel::PPPort 3.33よりMouse, Xslateともに

undefined symbol: DPPP_my_gv_fetchpvn_flags

というエラーでshared objectが読み込めない状態になっていました。これを修正しました。

なお、Devel::PPPortのメンテナであるmhxさんが「そもそもppport.hを動的に生成するのがよろしくない」と言っていたので、今後動的生成自体やめようかなとも思っています。

https://github.com/mhx/Devel-PPPort/issues/42

version表記

MouseとXslateは共にvX.Y.Zというversion表記を使っており、コード上では

our $VERSION = 'v2.4.10'; # Mouse
our $VERSION = '3.4.0';   # Xslate

と書いていました。ところでPerlは5.10からversion objectが本格的に導入されました。逆に言うとPerl 5.8ではversion関連でときどき問題が起こります。

実際、Perl 5.8環境下において、Mouseではuse Mouse versionがうまく動かない:

❯ perl -Mblib -w -e 'use Mouse 2'
Argument "v2.4.10" isn't numeric in subroutine entry at -e line 1.
Mouse version 2 required--this is only version v2.4.10 at -e line 1.
BEGIN failed--compilation aborted at -e line 1.

Xslateでは、shared objectがうまく読み込めない:

❯ XSLATE=xs perl -Mblib -MText::Xslate -e1
Text::Xslate object version v3.4.0 does not match bootstrap parameter 3.4.0

という問題が起きていました。

これを解決するために、

use version; our $VERSION = version->declare('v2.4.10');

という表記にあらためました。

もし、みなさんの中にも、単にour $VERSION = '1.2.3'などの表記を使っている方がいるなら

  • use version; our $VERSION = version->declare('v1.2.3')に変える
  • 同等な表現である1.002003に変える

をおすすめします。

minil化

Xslateはmodule makerとしてModule::Installを使っていました。Module::Installはその役割を終え、メンテナ自身も他のtoolに移行を促しているモジュールです。

よってXslateをtokuhiromさん作のauthoring toolであるMinillaの管理へ移行しました。

今後は誰でもminil releaseでXslateがリリースできるはずです。

なお、こういったXS moduleのminil化 (というかModule::Build化) の際、hideo55さん作のModule::Build::XSUtilが非常に便利です。

dotがINCに入っていないときの考慮

https://github.com/xslate/p5-Text-Xslate/pull/184

ご存知の通りPerl 5.26より、モジュールサーチパス(@INC)からカレントディレクトリが取り除かれました。よって例えばテストファイルでuse t::lib::Utilをしていると、単にprove -br tではテストが通らなくなります。これを修正しました。

Windowsの考慮

File::Copy::copyはファイルのmtimeを保存する

https://github.com/xslate/p5-Text-Xslate/pull/188

Windowsで、ときどきXslateのtemplate cacheファイル関連のテストがこけていました。
よくよく調べると、File::Copy::copyはWindowsではWin32::CopyFileであり、それはファイルのmtimeを保存することがわかりました。よってmtimeに基づきcacheファイルを使うか否かを判断しているテストがこけていたようです。

明示的にmtimeを"今"に変更するように修正しました。

appveyorでWindows CI

今後のためにappveyorでWindows CIを有効にしました。

https://github.com/xslate/p5-Text-Xslate/blob/master/.appveyor.yml
https://ci.appveyor.com/project/gfx/p5-text-xslate

なお、appveyorについてはpineさんの記事が参考になります。

今後

Perl 5.8でbuildできないという問題は直しましたが、Mouse, Xslateともにissueがある程度、たまっています。

できる範囲で少しずつ対応できていけたらなと思っています。直近では

  • そもそもPerl 5.8のサポートを切るのはどうか
  • XslateのMoo移行提案をどう決着させるべきか

あたりどうするか悩んでいます。興味ある方と一緒に議論したいです!

さて明日はsago35さんによる「Strawberry Perl に Minilla をインストールする」です!