|go ahead... be a heretic|
Installing modules directly from CPAN is easy, as long as the module contains no XS-extensions (C-code). Most Windows installations don't have a C-compiler, and even if there is one, the compilation of the XS-extensions is a tricky thingy, that can easily fail. So what can you do if you can't compile? The answer is: use a precompiled version.
The probably most popular port of Perl for Win32 is ActivePerl from ActiveState. It ships with a tool named ppm, aka the Programmer's Package Manager. ppm is a tool for installing modules, similar to the CPAN-shell. With it you can download and install modules, with or without XS-Extensions, with a few keystrokes.
The following describes the ppm Version that comes with Perl 5.8.0 and above. It differs slightly from the pppm that came with Perl 5.6
Advantages and features of ppm
As always, there are some tripwires and things you should know.
To invoke ppm, simply type ppm at the Windows console ("DOS") command line. The result will look similar to this:
To get immediate help in the ppm-shell, type help or help <command>.
In order to install a module you have basically two possibilities.
To install a module (here: Death::Star) directly, simply type
There is a drawback to using this method. If ppm finds more than one version of a module, you cannot choose which one gets installed. Naturally the most recent version gets installed, but there may be a case when you need to install another version. E.g. the most recent version can be buggy, or incompatible with another module you use.
You don't neccessarily need to use the ppm-shell to install a module. You can also use the following command to install a module directly from the command line.
To search for a module you use the search <string>-command. The parameter <string> for search is a case insensitive regex, thus if you don't know the module's full name, you can also search for pieces of it and you will get a list to choose from.
You can find out more about a module by using the desc <module>-command.
To install a module from the list, type install, followed by the module's number.
Regardless which method you choose, ppm will start to install the module and produce output like this:
If the module has dependencies (that is, it requires another module to work correctly) the dependencies are installed first.
From above, you may have noticed the term Active Repositories. ppm downloads the modules from special websites that are called repositories. A repository is a just a directory or a script that serves a list of ppd files to ppm. From these ppd files, ppm gets the actual location of the module's tarball. A freshly installed ActivePerl will come with two repositories. To find out about them, type rep.
In order to find out, which url a repository points to, you can use the rep desc <repository>-command.
A lot of modules are not available from the standard repositories. Thank crunchy, the community provides a lot of alternative repositories that offer the missing modules. For example our fellow brother jenda hosts a repository at http://jenda.krynicky.cz/perl.
If you want to add such a repository to ppm you will have to use the rep add <name> <location>-command.
From there on, the repository is known to ppm and will be used for future searches.
You don't need to permanently add a repository to install a module from it. You can specify the repository from the command line.
So how, you might ask, do I find out where these repositories are? The answer to this question is PPM::Repositories.pm. That's a module that basically consists of a list of all known repositories. The, at the time of this writing, most recent version (0.9) is available at bribe's repository at http://www.bribes.org/perl/ppm/With the following script, you can use PPM::Repositories.pm to add all known repositories to your ppm.
You should be aware that the more repositories you add, the longer it takes for a search to finish.
Getting around the proxy
If you are behind a proxy, you will notice that ppm cannot connect to the internet. To make it work, you will have to set a bunch of environment-variables, where xxx.xxx.xxx.x is the ip-address of the proxy, and y the port:
Instead of entering the variables each time you before you start ppm, you have other possibilities to set them:
Still there may be some environments where that fails. But don't worry, there is an alternative, namely creating a local repository.
The first step doing so is to create a directory on your system that serves as the repository. Name and position of that directory is not important, I use /perl/ppm/repository as an example.
Then add that directory to your ppm using the command described in adding a repository.
The next step is to download the ppd file of the module and save it to your repository. A ppd file is a xml file that contains information about the module's position, version, etc. It looks like
Identify the line that says <CODEBASE HREF="x86/Death-Star-2.0.tar.gz" />. It informs you about the relative position of the module's tar.gz-file, aka tarball. Now download that tarball and save it into the same relative postion. In this example that would be /perl/ppm/repository/x86/Death-Star-2.0.tar.gz.
Now you can use ppm to install the module from your local repository.
You also have the choice to install the module manually. To do so, simply download the tarball and extract it with WinZip or a similar program.
A typical ppm-distribution looks like this:
Now you can copy the files manually into your Perl's library tree, namely
Be aware that the module's html-documentation will not be integrated into the ActiveState-docs automatically. But if you do a complete rebuild of the HTML documentation, it will be added:
Using PPM to install modules
PPM::Make - Make a ppm package from a CPAN distribution
ppm3 - Programmer's Package Manager, version 3.1
how to create a ppm-distribution
HowTo build and distribute a PPMed module for Win32
Update: Corrected error concerning "Getting around the proxy"
Update: Included thundergnat's tip in the text, as suggested by GrandFather.
holli, /regexed monk/