How can I use CPAN as a non-root user?
cpan, perl
Solution
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.
`wget -O- http://cpanmin.us` fetches the latest version of `cpanm` and prints it to `STDOUT` which 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::cpanmins`]1 is the package that installs `cpanm`. `local::lib` is a helper module that manages the environment variables needed to run modules in local directory.
After those modules are installed we run
eval `perl -I ~/perl5/lib/perl5 -Mlocal::lib`
to set the environment variables needed to use the local modules and then
echo 'eval `perl -I ~/perl5/lib/perl5 -Mlocal::lib`' >> ~/.profile
to ensure we will be able to use them the next time we log in.
echo 'export MANPATH=$HOME/perl5/man:$MANPATH' >> ~/.profile
will hopefully cause man to find the man pages for your local modules.
Problem
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?