I want to install perl modules on a shared server on which I do not have root access. How can I do this? They also seem to have an older version of CPAN (it complains about that when running the command), is it possible to update the CPAN command being used from my account without requiring root access?
The easiest method I have found so far is to say:
wget -O- http://cpanmin.us | perl - -l ~/perl5 App::cpanminus local::lib
eval `perl -I ~/perl5/lib/perl5 -Mlocal::lib`
echo 'eval `perl -I ~/perl5/lib/perl5 -Mlocal::lib`' >> ~/.profile
echo 'export MANPATH=$HOME/perl5/man:$MANPATH' >> ~/.profile
This assumes your profile is named .profile
, you may need to change that to be .bash_profile
, .bashrc
, etc. After that you can install modules by saying
cpanm Module::Name
and simply use them the same way you would if the were installed in the root directories.
What follows is a brief explanation of what the commands above do.
Now,
wget -O- http://cpanmin.us
fetches the latest version of cpanm
, the cpa and prints it to STDOUT
The downloaded script is then piped to perl - -l ~/perl5 App::cpanminus local::lib
: The first -
tells perl
to expect the program to come in on STDIN
, this makes perl
run the version of cpanm
we just downloaded; perl
passes the rest of the arguments to cpanm
. The -l ~/perl5
argument tells cpanm
where to install Perl modules, and the other two arguments are two modules to install:
[App::cpanminus
]3 is the package that installs cpanm
. This installation is how cpanminus bootstraps: The script we downloaded now installs itself as an app.local::lib
is a helper module that manages the environment variables needed to run modules in local directory.Now that the installation itself is complete, we run:
eval `perl -I ~/perl5/lib/perl5 -Mlocal::lib`
to set the environment variables needed to use the local modules in this shell session, and
echo 'eval `perl -I ~/perl5/lib/perl5 -Mlocal::lib`' >> ~/.profile
to ensure we set them in our next login shell session.
Finally, we ensure future login shell sessions will have the local modules' man-help pages available for the man
utility to search, with
echo 'export MANPATH=$HOME/perl5/man:$MANPATH' >> ~/.profile
this will hopefully cause man
to find the man pages for your local modules.