LoginSignup
3
2

More than 5 years have passed since last update.

[perl]モジュールにデータディレクトリを同梱する

Posted at

これは基礎の基礎なのかもしれませんが、気づいてから解決するまで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通るから気をつけて。


  1. use Path::Tiny;してたせいだった。 

  2. 標準モジュールではないのでcpanm File::Shareしてください。 

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2