この記事は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 をインストールする」です!