How to install Carton module into local project with perlbrew? - perl

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

Related

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

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

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.

How to uninstall from `Carton`

I have Carton environment and install modules into ./local/ from cpanfile. But now I do not require some modules and want to remove some.
I can remove ./local folder and install modules from scratch but this take a time. I have found this
carton uninstall Module
But it does not exists anymore.
Is there something like carton uninstall?
I workaround I just delete local folder and install modules from scratch:
rm -r local
carton
UPD
Note: This can take a while to install from scratch.
Thus to save time you can pass --notest option to cpanm via PERL_CPANM_OPT:
PERL_CPANM_OPT=--notest carton
Or if you you want to prevent querying for new versions:
carton install --deployment
This will install modules without testing them. This is safe in compare to previous command because you know that module was installed before (tests were PASS)

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>