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?
-
1possible duplicate of [How can I use a new Perl module without install permissions?](http://stackoverflow.com/questions/251705/how-can-i-use-a-new-perl-module-without-install-permissions) – daxim May 06 '11 at 07:06
5 Answers
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.

- 427
- 4
- 9

- 64,182
- 22
- 135
- 226
-
7This has been working excellent for me. Just a small note to remove first any existing PERL5LIB environment variables already in your ~/.profile (or whatever). Otherwise local::lib will fail to install when running the first command. – Juan A. Navarro Jun 13 '10 at 12:00
-
@juannavar Good point, I tend to install it on newly installed machines, so I don't run into that case. – Chas. Owens Jun 13 '10 at 12:20
-
Great example using wget instead of curl - many systems don't come with curl by default though they do wget, so this is helpful for those without root to install new packages. – AndrewPK Aug 06 '12 at 16:56
-
Great answer, thank you! Nice way to install cpanm to be able to install Perl packages locally. I think, in some environments, .bash_profile might be used rather than .profile. – basic6 Feb 24 '15 at 10:49
-
-
1@HielkeWalinga Child processes cannot modify the environment of parent processes. To deal with this, commands like `perl -I ~/perl5/lib/perl5 -Mlocal::lib` or `ssh-agent` that need to set environment variables for a parent process print out the commands that need to be run in the parent process and then you `eval` them. You don't actually need to `eval` them though. You could say `perl -I ~/perl5/lib/perl5 -Mlocal::lib > /tmp/commands; source /tmp/commands`, but the eval method is cleaner (no files to clean up or accidentally overwrite). – Chas. Owens Aug 14 '18 at 13:30
-
For me this procedure was not enough because `cpanm` was still not in my path. I had to do `export PATH=$HOME/perl5/bin:$PATH` to put it in my path. After, the modules I installed with `cpanm` were not in the perl lib path: I had to to `export PERL5LIB=$HOME/perl5/lib/perl5${PERL5LIB:+:$PERL5LIB}` to fix that. – Jean Paul Dec 17 '20 at 14:14
http://novosial.org/perl/life-with-cpan/non-root/
The main step in both sets of instructions involves local::lib module
AFAIK, CPAN logic is contained in Perl module (CPAN.pm) which means you can also easily install the newer one in your local directory as you would with any other Perl module.
Also, once you install your modules in non-standard location, check out these two questions on loading libraries from non-standard locations (some of the info is already available in the link above):
How does a Perl program know where to find the file containing Perl module it uses?
How is Perl’s @INC constructed? (aka What are all the ways of affecting where Perl modules are searched for?)
-
1
-
2There are at least four different ways to install modules from CPAN: by hand, the CPAN module (and its commandline equivalent `cpan`), the `CPANPLUS` module (and its commandline equivalent `cpanp`), and the newish App::cpanminus distribution that installs `cpanm`. Of these, I find `cpanm` to be the easiest to install and use. `cpan` and `cpanp` are installed by default, but require significant setup to work correctly. – Chas. Owens Jun 05 '10 at 14:51
-
404: The requested URL /writing/articles/install-perl-modules-without-root was not found on this server. – harschware May 27 '15 at 20:06
For completeness, this is the installation process of cpanm
on OSX if you want to keep your perl5
under ~/Library
.
curl -L http://cpanmin.us | perl - -l ~/Library/perl5 App::cpanminus local::lib
eval `perl -I ~/Library/perl5/lib/perl5 -Mlocal::lib=~/Library/perl5`
echo 'eval `perl -I ~/Library/perl5/lib/perl5 -Mlocal::lib=~/Library/perl5`' >> ~/.bash_profile

- 10,595
- 6
- 48
- 52
If you want to be able to read man pages for the cpanminus-installed modules as well, you should also make sure the correct subdirectory of the chosen library path is in MANPATH. So the above solution showing the installation process of cpanm needs the following additional command:
export MANPATH=$HOME/Library/perl5/man:$MANPATH' >> ~/.bash_profile

- 427
- 4
- 9
we have been using the following func during the last 6 months on over 20 deployments successful automated deployments to aws ... called from the main provisioning as follows, which is basically just a copy paste of the answers above, but in a single re-usable bash script:
#! /usr/bin/env bash │··
│··
# a bash wrapper for check-installing required perl modules as non-root
main(){ │··
doSetVars │··
doCheckInstallPreReqs │··
perl $PRODUCT_INSTANCE_DIR/src/perl/my-perl-script.t │··
} │··
│··
doSetVars(){ │··
#set -x │··
umask 022 ; │··
set -u -o pipefail │··
run_unit_bash_dir=$(perl -e 'use File::Basename; use Cwd "abs_path"; print dirname(abs_path(@ARGV[0]));' -- "$0") │··
export PRODUCT_INSTANCE_DIR=$run_unit_bash_dir/../.. │··
} │··
│··
doCheckInstallPreReqs(){ │··
eval `perl -I ~/perl5/lib/perl5 -Mlocal::lib` │··
perl -e ' │··
use JSON ; │··
use Data::Printer; │··
use Test::Most ; │··
use Test::Mojo; │··
use Data::Printer ; │··
use FindBin; │··
use JSON::Parse ; │··
use IPC::System::Simple ; │··
use Mojolicious ; │··
' || { │··
curl -L 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`' >> ~/.bashrc │··
cpanm --local-lib=~/perl5 local::lib && eval $(perl -I ~/perl5/lib/perl5/ -Mlocal::lib) │··
export PERL_MM_USE_DEFAULT=1 │··
cpanm JSON Data::Printer Test::Most Test::Mojo Data::Printer FindBin JSON::Parse \ │··
IPC::System::Simple │··
sudo curl -L cpanmin.us | perl - Mojolicious │··
} │··
│··
} │··
│··
main

- 5,114
- 1
- 56
- 53