How can I install Perl modules without root privileges?

37,686

Solution 1

See local::lib.

Once you have it installed, you can do:

perl -MCPAN -Mlocal::lib -e 'CPAN::install(LWP)'

Solution 2

There's the way documented in perlfaq8, which is what local::lib is doing for you.

It's also a frequently asked StackOverflow question:

Curiously, none of these are suggested when I use your original question title (which is one of the reasons a good title is very important in finding your answer).


How do I keep my own module/library directory?

When you build modules, tell Perl where to install the modules.

If you want to install modules for your own use, the easiest way might be local::lib, which you can download from CPAN. It sets various installation settings for you, and uses those same settings within your programs.

If you want more flexibility, you need to configure your CPAN client for your particular situation.

For Makefile.PL-based distributions, use the INSTALL_BASE option when generating Makefiles:

perl Makefile.PL INSTALL_BASE=/mydir/perl

You can set this in your CPAN.pm configuration so modules automatically install in your private library directory when you use the CPAN.pm shell:

% cpan
cpan> o conf makepl_arg INSTALL_BASE=/mydir/perl
cpan> o conf commit

For Build.PL-based distributions, use the --install_base option:

perl Build.PL --install_base /mydir/perl

You can configure CPAN.pm to automatically use this option too:

% cpan
cpan> o conf mbuild_arg "--install_base /mydir/perl"
cpan> o conf commit

INSTALL_BASE tells these tools to put your modules into /mydir/perl/lib/perl5. See How do I add a directory to my include path (@INC) at runtime? for details on how to run your newly installed modules.

There is one caveat with INSTALL_BASE, though, since it acts differently than the PREFIX and LIB settings that older versions of ExtUtils::MakeMaker advocated. INSTALL_BASE does not support installing modules for multiple versions of Perl or different architectures under the same directory. You should consider if you really want that, and if you do, use the older PREFIX and LIB settings. See the ExtUtils::Makemaker documentation for more details.

Solution 3

CPAN way

  1. run cpan command. If you don't have CPAN configurated, do it first! Otherwise, you will see the cpan prompt. In this case, type look local::lib and you will have a new shell prompt. In this new shell, run the bootstrap command configuring and compiling the module at same time as at bellow.

    user@host:~/.cpan/build/local-lib-1.004003-UyX2wf$ perl Makefile.PL --bootstrap && make test && make install

  2. Now, export some variables:

    Path where local::lib will install things

    echo 'eval $(perl -I$index.t/perl5/lib/perl5 -Mlocal::lib)' >> ~/.bashrc

    And Perl variable to avoid user input

    echo 'export PERL_MM_USE_DEFAULT=1' >> ~/.bashrc

  3. Now load your bashrc running

    source ~/.bashrc

  4. Try to install running cpan <SOME_VALID_MODULE_NAMESPACE>

That's it! Now you can install modules using cpan without root privileges. But, remember that this will work just for the CURRENT USER including the root user !

cpanminus way

If you have this installed your sys admin deserves a beer!

Just run

$ cpanm --local-lib=~/perl5 local::lib && eval $(perl -I ~/perl5/lib/perl5/ -Mlocal::lib)

Open another terminal and run

$ env |grep PERL

You should see something like this:

PERL5LIB=$HOME/perl5/lib/perl5 PERL_MB_OPT=--install_base "$HOME/perl5"

PERL_LOCAL_LIB_ROOT=$HOME/perl5

PERL_MM_OPT=INSTALL_BASE=$HOME/perl5

But if you're not, export variables like this:

$ echo "export PERL5LIB=\"$HOME/perl5/lib/perl5\"">>~/.bashrc && \ echo "export PERL_MB_OPT=\"--install_base '$HOME/perl5'\">>~/.bashrc && \ echo "export PERL_LOCAL_LIB_ROOT=$HOME/perl5">>~/.bashrc

Finally, load your bashrc file and try to install with commands

source ~/.bashrc

and

cpanm <SOME_VALID_MODULE_NAMESPACE>

Fim!

Share:
37,686
petersohn
Author by

petersohn

Updated on July 09, 2022

Comments

  • petersohn
    petersohn almost 2 years

    I am on a Linux machine where I have no root privileges. I want to install some packages through CPAN into my home directory so that when I run Perl, it will be able to see it.

    I ran cpan, which asked for some coniguration options. It asked for some directory, which it suggested ~/perl "for non-root users". Still, when I try to install a package, it fails at the make install step, because I don't have write access to /usr/lib/perl5/whatever.

    How can I configure CPAN so that I can install packages into my home directory?

  • Spear
    Spear over 6 years
    Not working: mkdir /root/.cpan: Permission denied at /usr/lib/perl5/5.8.5/CPAN.pm line 2342. Any way to test if local::lib has been properly installed ?
  • silbana
    silbana over 6 years
  • phlummox
    phlummox about 3 years
    Just commenting to say that the "cpanminus way" seems to work very well on Debian- or Ubuntu-based systems where you don't have root access. Assuming the Debian package cpanminus is installed, you can specify a custom installation directory as noted above, and then install even a complicated package like cpanm Tk, and everything Just Works™ (assuming you have a C compiler and so on installed in your PATH.)