Does local::lib support installing to the project directory? - perl

With node, when I run npm install things get installed into ./node_modules. Is there any method to make all of my Perl modules install local to the project directory? Not to my home directory, or to my system?
Something like ./perl_modules?

You can do this with cpanm with --local-lib-contained=node_modules
cpanm --local-lib-contained=perl_modules install Mojo
Then you can run tell perl to use it by setting -I like this,
perl -I./perl_modules/lib/perl5/ -MMojo -E1

Related

How to install Carton module into local project with perlbrew?

I use perlbrew to easy switch between perl.
I use Carton to install modules only for current project into /local directory.
But when I deploy application on new host.
I do:
perlbrew install -v -j 8 --notest --switch perl-5.30.3
perlbrew install-cpanm
cpanm Carton
But last step will install Carton into perlbrew libs
Is there a way to install Carton into my project local/lib/perl5 directory?
I want to keep base perlbrew clean
To install modules into your own directory we can use --local-lib option.
It is mentioned here and described at examples cpanm --help
cpanm --local-lib ./local
probably useful options for this task are:
-n,--notest Do not run unit tests
--self-contained Install all non-core modules, even if they're already installed
If you do deploy often probably you do not need to retest each time. This is meaningless.
Second option is useful when you want modules to be installed into you local directory despite on they are already installed into system/brew perl

perl carton cpanfile, optional install into main perl environment

I have a carton cpanfile. on servers on which I have sudo, I would be happy to install the latest versions of my modules globally instead.
do I write a script that removes the 'requires' and uses cpan -i (although I am concerned that I may have too many to fit the command line limit), or is this functionality already somewhere else?
If there is a cpanfile you can just run
$ cpanm --installdeps .
as root (with sudo) in the directory with the cpanfile and cpanm will read it and install your dependencies to whatever Perl is configured for this cpanm.
You can ignore carton for that completely.

perlbrew: installing a perl module locally

I've got perlbrew installed on OS X fine, and can install Perl modules from CPAN, using 'cpanm' no problem.
But, now I'm attempting to install a Perl module provided from a software vendor, and that PM is not on CPAN - you download it from their application and install it "locally".
I'm not sure how to accomplish this with perlbrew ?
The documentation states to do a direct install, download the tar.gz file, extract it, then:
cd Infoblox-xxxxxxx/
perl Makefile.PL
make
make install
But if I do this, I guess it will install it for the OS Perl version, not my perlbrew install.
The other option mentioned is to create a local CPAN site and add the appliance URL (to grab the Perl module) to the list of sites. Is this possible with perlbrew ?
Thanks !
cd Infoblox-xxxxxxx/
perl Makefile.PL
make
make install
But if I do this, I guess it will install it for the OS Perl version, not my perlbrew install.
If you are using perlbrew to select your perl, it should install in the appropriate location for the perl you selected.
which perl will tell you which perl you are using.
If you want to use a specific perl without leaving things to perlbrew, you can always invoke the specific perl you want using its full path:
cd Infoblox-xxxxxxx/
~/perl5/.../bin/perl Makefile.PL
make
make install

How do I install CPAN modules while using perlbrew?

I have started using perlbrew and installed perl-5.12.2.
I understand I need to re-install my CPAN modules, so I switched to my new Perl version (perlbrew switch perl-5.12.2 and hash -r), verified the switch was successful (perl -v) then tried installing some module (File::Copy::Recursive using cpan. However, cpan says `File::Copy::Recursive is up to date (0.38).
When I start a Perl script using this module, it shouts Can't locate File/Copy/Recursive.pm in #INC ... (showing many perl-5.12.2 locations). When I switch back to my 'normal' Perl (perlbrew off) the script runs fine.
Any suggestions? Perhaps CPAN does not work well with perlbrew?
After installing perlbrew you could install cpanm through this command:
perlbrew install-cpanm
Otherwise you will need to install cpanm manually each time you switch your Perl version on perlbrew. With this command just once.
Once installed you can then use cpanm to install the missing module:
cpanm File::Copy::Recursive
Everything should be working fine with "cpan" as well as "cpanm", that is: when switching perl with perlbrew, cpan sees the installed modules of the version you use.
While it's true that cpanm is the recommended tool to use with perlbrew, cpan allows for test reporting so that is what I always use.
How do I install CPAN modules while using perlbrew?
That's how:
perlbrew use <version>
cpan -i <module>

How can I install Perl modules without root privileges?

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?
See local::lib.
Once you have it installed, you can do:
perl -MCPAN -Mlocal::lib -e 'CPAN::install(LWP)'
There's the way documented in perlfaq8, which is what local::lib is doing for you.
It's also a frequently asked StackOverflow question:
Why does installing certain CPAN modules require root privilege?
How can I install CPAN modules locally without root access (DynaLoader.pm line 229 error)?
How do I tell CPAN.pm to install all modules in a specific directory?
How can I install a CPAN module into a local directory?
How can I use a new Perl module without install permissions?
How can I use CPAN as a non-root user?
How can I install local modules with the cpan tool?
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.
CPAN way
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
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
Now load your bashrc running
source ~/.bashrc
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!