これは基礎の基礎なのかもしれませんが、気づいてから解決するまで3日以上ハマってたので共有します。
要旨
モジュールにYAMLなどのデータを同梱したディレクトリをつけて配布したい。
経緯
Data::Pokemon::GoというPerlモジュールをリリースしたんですけど、インストール時には読み込んでくれるdata/
ディレクトリがイントール後には行方不明になってまして、なにがしかの方法(SCPなど)を使って呼び出し元のスクリプトの近くに相対パスでデータをコピーしてやらないと使えない状態が続いてました。1
調べてみてもなかなか良い記事が見つからず、うーん、こんなに難しいはずがないだろうと思ってました。
こんな英語の記事は見つけたんですけど、私はMinillaを使っているのでBuild.PL
を直接編集できなかった(しても自動的に戻される)んですね。
で、ようやくたどり着いた記事がこちら。要するにdata/
という名前が悪くてshare/
ならOKというPerlの仕様だということを突き止めました。
それで、あとは
file_share.pl
use File::Share 'dist_dir';
my $dir = dist_dir('Data-Pokemon-Go');
my $data = YAML::XS::LoadFile("$dir/Skill.yaml");
のように、モジュール内のshare/
ディレクトリへの絶対パスを取得して読みに行くだけでした。2
要約
データはshare/
に入れる。
呼び出すときはFile::Share::dist_dir
を使う。
使わなくてもtest通るから気をつけて。