Warning: I'm rather new to PAR, so maybe I'm asking a FAQ (I don't think so).
How can a bundled module load some data files included
with it in the .par file?
I'm developping a library for a client, let's call it Bam::Kapow.
Some data files are needed, so I put them
where I was sure I'd find them: in Bam/Kapow/, just below Bam/Kapow.pm.
Here are the few files (simplified as much as possible):
- lib/Bam/Kapow.pm
package Bam::Kapow;
use strict;
use Carp;
use File::Basename;
use File::Spec::Functions;
our $VERSION = "0.01";
our %Info = ();
# load the data file
for my $data (qw( motd issue ) ) {
my $file = catfile( dirname( $INC{'Bam/Kapow.pm'} ), 'Kapow', $dat
+a );
open my $fh, $file
or carp "Can't open $file: $!";
$Info{$data} = join '', <$fh>;
close $fh;
}
1;
- lib/Bam/Kapow/motd
Message of the day: PAR rules!
- lib/Bam/Kapow/issue
Well, I have this minor issue with PAR...
- example script.pl
#!/usr/bin/perl
use Bam::Kapow;
print "Using Bam::Kapow version $Bam::Kapow::VERSION\n";
print "MOTD: $Bam::Kapow::Info{motd}\n";
print "Got Bam::Kapow from $INC{'Bam/Kapow.pm'}\n";
Creating a self-extracting script with the needed library is rather easy, once you know how to pack those additionnal files:
$ find lib/Bam/Kapow/ -type f > bam_kapow.lst</tt>
$ pp -o script.exe -A bam_kapow.lst -I lib script.pl
$ PATH= ./script.exe
Using Bam::Kapow version 0.01
MOTD: Message of the day: PAR rules!
Got Bam::Kapow from /tmp/par-ufwk/cache-e73b24e48419250052360127de57a0
+74/inc/lib/Bam/Kapow.pm
Now, I would like to package this as a .par file, rather
than as a self-extractible script. The test script would
become:
#!/usr/bin/perl
use PAR;
use lib 'Bam-Kapow';
use Bam::Kapow;
print "Using Bam::Kapow version $Bam::Kapow::VERSION\n";
print "MOTD: $Bam::Kapow::Info{motd}\n";
print "Got Bam::Kapow from $INC{'Bam/Kapow.pm'}\n";
First way to create the .par file and test:
$ zip -r Bam-Kapow.par lib
adding: lib/ (stored 0%)
adding: lib/Bam/ (stored 0%)
adding: lib/Bam/Kapow/ (stored 0%)
adding: lib/Bam/Kapow/motd (stored 0%)
adding: lib/Bam/Kapow/issue (stored 0%)
adding: lib/Bam/Kapow.pm (deflated 40%)
$ perl script2.pl
perl script2.pl
Can't open /tmp/par-ufwk/cache-51eaa99df530ab0d3b760931a92bb43c/Kapow/
+motd: No such file or directory at script2.pl line 4
Can't open /tmp/par-ufwk/cache-51eaa99df530ab0d3b760931a92bb43c/Kapow/
+issue: No such file or directory at script2.pl line 4
Using Bam::Kapow version 0.01
MOTD:
Got Bam::Kapow from /tmp/par-ufwk/cache-51eaa99df530ab0d3b760931a92bb4
+3c/a23f3e6c.pm
ls /tmp/par-ufwk/cache-51eaa99df530ab0d3b760931a92bb43c/
a23f3e6c.pm
This does not seem to work (the files are not extracted).
Let's try something else:
$ pp -o Bam-Kapow.par -p -M Bam::Kapow -A bam_kapow.lst -I lib -e 1
$ perl script2.pl
Can't open /tmp/par-ufwk/cache-51eaa99df530ab0d3b760931a92bb43c/Kapow/
+motd: No such file or directory at script2.pl line 4
Can't open /tmp/par-ufwk/cache-51eaa99df530ab0d3b760931a92bb43c/Kapow/
+issue: No such file or directory at script2.pl line 4
Using Bam::Kapow version 0.01
MOTD:
Got Bam::Kapow from /tmp/par-ufwk/cache-51eaa99df530ab0d3b760931a92bb4
+3c/40599894.pm
Same problem, no surprise here.
Is PAR::read_file() my only option? That means that the module needs to detect if it was loaded with PAR or not (I have a test suite to run, after all), which may lead to more complicated (and buggy) code.