2012-02-14 2 views
10

Я начал module-starter--builder=Module::Build). Я хочу использовать SQL::Library для сбора моего SQL в файл .ini ... но для того, чтобы найти файл во время выполнения, мне нужно знать его точный путь. Как мне получить путь к «каталогу данных» модуля во время выполнения?Как следует распространять файлы данных с помощью модулей Perl?

До сих пор я использовал FindBin (например, "$FindBin::Bin/../../path/to/module/datafiles/foo.ini", но я обнаружил, что это не очень надежный (например, он, кажется, сломается, когда в двух разных программах в PATH есть две программы с тем же именем).

ответ

16

Это то, что для File::ShareDir. Поскольку вы используете Module :: Build, вам необходимо установить параметр share_dir (и потребовать Module :: Build 0.36), чтобы ваши файлы данных были установлены вместе с вашими Затем в вашем коде вы будете использовать File :: ShareDir для вычисления пути foo.ini (например, dist_file('My-Dist', 'foo.ini'))

+0

Могу ли я получить файл «File :: ShareDir», чтобы найти файлы, когда модуль равен n ot еще установлен, из сценариев в bin/или тестовых файлах? – user1481

+0

@ user1481, скрипты, запускаемые через 'Build test', найдут файл, потому что модуль установлен (в' blib/') при выполнении этих тестов. – ikegami

+1

@ user1481, для других скриптов либо выполните perl Build.PL && ./Build && perl -Mblib script.pl', либо добавьте код для возврата в '' $ FindBin :: Bin /../ share/foo.ini " 'если файл, возвращенный File :: ShareDir, не существует. – ikegami

Смежные вопросы