Distribute a full Perl application to users.
The three main ways to distribute an application are via an installer, via a standalone executable, or via source. These choices vary a lot across platforms. Windows users prefer installers, especially .msi files. Mac fans are quite happy with .app files, which usually come in disk images. Most Linux variants use installers (.deb and .rpm) but others prefer source.
What if your application is a Perl program?
Perl may seem like an atypical GUI language, but it does have bindings for GUI toolkits including Tk, wxWidgets, Qt, and GTK. Perl can be useful in the GUI realm as a rapid-development foundation or simply to add a couple of dialogs to a mostly background process. One great entry barrier, however, is that most platforms do not bundle these GUI toolkits with Perl—and some platforms do not bundle Perl at all. Though there are packaged distributions of Perl itself, the add-on modules that usually accompany any sophisticated Perl project are typically source code. This poses a problem for most Windows users and many Mac users for whom this is too low-level a task. Only the sysadmin-rich world of Linux and Unix regularly tolerates sudo cpan install Foo
commands.
The PAR project attempts to to create a solution to bundling the myriad files that usually compose a Perl application into a manageable monolith. PAR files are simply ZIP files with manifests. If you have PAR installed on your computer, you can write Perl code that looks like:
#!perl -w use PAR 'foo.par'; use Foo; ...
and if Foo.pm is inside the foo.par file, perl
will load it as if it were a normal installed module. Even more interestingly, you can write:
#!perl -w use PAR 'http://www.example.com/foo.par'; use Foo; ...
which will download and cache the foo.par archive locally. How's that for a quick update?
You may have noticed the sticky phrase above "If you have PAR installed..." That is a catch-22 of sorts. PAR helps users to skip the software installation steps, but first they have to...install software!
To get around this, PAR takes another page from the ZIP playbook: self-extracting executables. The PAR distibution comes with a program called pp
that allows a developer to wrap the core of Perl and any additional project-specific Perl modules into a PAR file with a main.pl and an executable header to bootstrap the whole thing. This produces something like /usr/bin/perl
with all of its modules embedded inside.
Consider a basic helloworld.pl
application:
#!perl -w use strict; use Tk; my $mw = MainWindow->new( ); $mw->Label(-text => 'Hello, world!')->pack( ); $mw->Button(-text => 'Quit', -command => sub { exit })->pack( ); MainLoop( );
To run this, you have to have Perl and Tk installed[1] and perhaps X11 running (via open /Applications/Utilities/X11.app
). Run perl helloworld.pl
to see a window like that in Figure 4-1.
Now suppose that you want to give this cool new application to other Mac users. Telling them to first install Fink, Tk, and X11 just for "Hello, World!" is ludicrous. Instead, build an executable with pp
:
% pp -o helloworld helloworld.pl
That creates a 3 MB executable, helloworld, which includes the entirety of both Perl and Tk. Send it to a friend who has a Mac (and X11, because this version of Tk isn't Aqua-friendly) and she can run it. If you were to make a Windows version it would be even easier on end users—on Windows, Tk binds directly to the native GUI, so X11 is not a prerequisite.
Aside from portability, another PAR benefit is version independence. The example executable, though built against Perl 5.8.6 on Mac OS X 10.4, should also work well on 10.3 or 10.2, even though those OSes shipped with older versions of Perl. This is because PAR included every part of 5.8.6 that the example needed in the executable.
If you download that executable, you can open it with any zip tool:
% zipinfo helloworld
Archive: helloworld 3013468 bytes 689 files
drwxr-xr-x 2.0 unx 0 b- stor 23-Oct-05 14:21 lib/
drwxr-xr-x 2.0 unx 0 b- stor 23-Oct-05 14:21 script/
-rw-r--r-- 2.0 unx 20016 b- defN 23-Oct-05 14:21 MANIFEST
-rw-r--r-- 2.0 unx 210 b- defN 23-Oct-05 14:21 META.yml
-rw-r--r-- 2.0 unx 4971 b- defN 23-Oct-05 14:21 lib/AutoLoader.pm
-rw-r--r-- 2.0 unx 4145 b- defN 23-Oct-05 14:21 lib/Carp.pm
... [snipped 679 lines] ...
-rw-r--r-- 2.0 unx 12966 b- defN 23-Oct-05 14:21 lib/warnings.pm
-rw-r--r-- 2.0 unx 787 b- defN 23-Oct-05 14:21 lib/warnings/register.pm
-rw-r--r-- 2.0 unx 186 t- defN 23-May-05 22:22 script/helloworld.pl
-rw-r--r-- 2.0 unx 262 b- defN 23-Oct-05 14:21 script/main.pl
689 files, 2742583 bytes uncompressed, 1078413 bytes compressed: 60.7%
Tip
You may see that the file sizes don't match. That's because the EXE also contains the whole Perl interpreter outside of the ZIP portion. That adds an extra 200% to file size in this case.
Is it fast? No. Perl must unzip the file prior to use (which happens automatically, of course). Is it compact? No, 3 MB for Hello World is almost silly. Is it convenient? Yes—and that is often the most important quality when shipping software to users.
An interesting consequence of this distribution model is that the executable contains all of the source code. For some companies this may represent a problem (with some possible solutions listed at http://par.perl.org/). On the other hand it is also a benefit in that you might satisfy any GPL requirements without having to offer a separate source download.
Tip
An important note for Windows is that, thanks to ActiveState, you do not need a C compiler to build Perl yourself. They provide an installable package that includes Tk pre-built. See links on http://par.perl.org/ for pre-compiled installers for PAR.
Get Perl Hacks now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.