MouseとText::Xslateをリリースした

この記事はPerl Advent Calendar 2017の11日目の記事です。
昨日はtsucchiさんの[Minion について](http://tsucchi.github.io/perl/2017/12/10/minion)でした。Minionはv8からadmin uiが付属するようになったらしいので使わねばと思っていたところでした。

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

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

を書きたいと思います。

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

[Mouse](https://metacpan.org/release/Mouse)はShawn M Mooreさん作のPerl5に本格的なオブジェクト指向プログラミングを導入するものです。

[Text::Xslate](https://metacpan.org/release/Text-Xslate)はgfxさん作の高速なtemplateエンジンです。

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

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

このOSSメンテナを引き継ぐモチベーションは、buildersconでのshibataさんの発表「[OSS の引き継ぎ方](https://builderscon.io/tokyo/2017/session/ab4825b9-8158-4c99-90e4-386d07efe038)」が与えてくれました。ありがとうございます。

# どういう変更をしたか

## 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](https://metacpan.org/pod/Module::Install)を使っていました。Module::Installはその役割を終え、メンテナ自身も他のtoolに移行を促しているモジュールです。

よってXslateをtokuhiromさん作のauthoring toolである[Minilla](https://metacpan.org/pod/Minilla)の管理へ移行しました。

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

なお、こういったXS moduleのminil化 (というかModule::Build化) の際、hideo55さん作の[Module::Build::XSUtil](https://metacpan.org/pod/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さんの記事](https://qiita.com/pine613/items/3fdc4e1bd06065cc056d)が参考になります。

# 今後

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

* https://github.com/gfx/p5-Mouse
* https://github.com/xslate/p5-Text-Xslate

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

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

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

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