2012-02-14 9 views
10

He comenzado un module-starter (con --builder=Module::Build). Quiero usar SQL::Library para recopilar mi SQL en un archivo .ini ... pero para encontrar el archivo durante el tiempo de ejecución, necesito saber su ruta exacta. ¿Cómo obtengo la ruta del "directorio de datos" de un módulo en tiempo de ejecución?¿Cómo debo distribuir archivos de datos con módulos Perl?

Hasta ahora, he estado usando FindBin (como "$FindBin::Bin/../../path/to/module/datafiles/foo.ini", pero encontré que esto no es muy robusto (Por ejemplo, parece que se rompe cuando hay dos programas con el mismo nombre en dos directorios diferentes en RUTA).

Respuesta

16

Esto es lo que File::ShareDir es para. Dado que está utilizando Module :: Build, tendrá que establecer el parámetro share_dir (y requerir Module :: Build 0.36) para que sus archivos de datos se instalen junto con su módulo. Luego, en su código, usará File :: ShareDir para calcular la ruta de foo.ini (por ej. dist_file('My-Dist', 'foo.ini'))

+0

¿Puedo obtener 'File :: ShareDir' para encontrar archivos cuando el módulo está n ¿Aún está instalado, desde scripts en bin/o archivos de prueba? – user1481

+0

@ user1481, los scripts ejecutados a través de 'Build test' encontrarán el archivo porque el módulo está instalado (en' blib/') cuando se ejecutan esas pruebas. – ikegami

+1

@ user1481, para otras secuencias de comandos, haga 'perl Build.PL && ./Build && perl -Mblib script.pl' o agregue código a la alternativa' '$ FindBin :: Bin /../ share/foo.ini" 'si el archivo devuelto por File :: ShareDir no existe. – ikegami

Cuestiones relacionadas