perlperlbrewdist-zilla

use perlbrew with dist zilla test


I am using the Dist::Zilla module to release and test my module. I am also using Perlbrew. When I run a script using perlbrew that includes my module, the script runs fine:

use strict;
use My::Module;

However, whenever I run dzil test, on a test that just tries to include my module:

#!perl -T
use strict;
use warnings FATAL => 'all';
use Test::More;

plan tests => 1;

BEGIN {
    use_ok( 'My::Module' ) || print "Bail out!\n";
}

diag( "Testing My::Module $My::Module::VERSION, Perl $], $^X" );

It fails with this error saying that it can't find the module Mouse (which my module includes):

Error:  Can't locate Mouse.pm in @INC (you may need to install the Mouse module) (@INC contains:
/Users/user/github/My/Module/.build/HoKOnIQGYr/blib/lib
/Users/user/github/My/Module/.build/HoKOnIQGYr/blib/arch
/Users/user/perl5/lib/perl5/darwin-thread-multi-2level
/Users/user/perl5/lib/perl5/darwin-thread-multi-2level
/Users/user/perl5/lib/perl5
/opt/local/lib/perl5/vendor_perl/5.16.1/darwin-thread-multi-2level/
/Users/user/perl5/lib/perl5/darwin-thread-multi-2level
/Users/user/perl5/lib/perl5
/opt/local/lib/perl5/vendor_perl/5.16.1/darwin-thread-multi-2level/
/Library/Perl/5.18/darwin-thread-multi-2level /Library/Perl/5.18
/Network/Library/Perl/5.18/darwin-thread-multi-2level
/Network/Library/Perl/5.18
/Library/Perl/Updates/5.18.2/darwin-thread-multi-2level
/Library/Perl/Updates/5.18.2
/System/Library/Perl/5.18/darwin-thread-multi-2level
/System/Library/Perl/5.18
/System/Library/Perl/Extras/5.18/darwin-thread-multi-2level
/System/Library/Perl/Extras/5.18) at
/Users/user/github/My/Module/.build/HoKOnIQGYr/blib/lib/My/Module.pm line 4.

It says that it cannot find Mouse.pm, which I know is located at

/Users/user/perl5/lib/perl5/darwin-2level

I see that for some reason that directory is not located in @INC, which is interesting because if I run this command to print out all the directories in @INC:

perl -e 'print "$_\n" for @INC'

I get:

/Users/user/perl5/lib/perl5/darwin-2level
/Users/user/perl5/lib/perl5
/opt/local/lib/perl5/vendor_perl/5.16.1/darwin-thread-multi-2level/
/Users/user/perl5/perlbrew/perls/perl-5.16.0/lib/site_perl/5.16.0/darwin-2level
/Users/user/perl5/perlbrew/perls/perl-5.16.0/lib/site_perl/5.16.0
/Users/user/perl5/perlbrew/perls/perl-5.16.0/lib/5.16.0/darwin-2level
/Users/user/perl5/perlbrew/perls/perl-5.16.0/lib/5.16.0
.

So when I run perl on the command line then the darwin-2level directory is present in @INC, but whenever I run dzil test it is not. This might not have much to do with Dist::Zilla, since I think Dist::Zilla just creates Makefile.PL and runs make test for you. Could this be because for testing an older version of perl is being required? Like so:

use 5.006;

But even so, some Perlbrew directories are present in @INC during the test such as

/Users/user/perl5/lib/perl5/darwin-thread-multi-2level

Does anyone know how I can make it so I can use the Mouse installation in my perl directory instead of installing a systemwide one? I had a previous error with another module that couldn't be found when I ran dzil test, and that module was in the same directory as Mouse. I was able to fix the issue by installing the module systemwide instead of locally in my home perl5 directory, but I'd prefer to use the Mouse installed by Perlbrew and not mess with my system perl if possible. I am using Perlbrew version 0.73.


Solution

  • You're trying to install it using the wrong perl since you're using dzil installed by a different perl than the one you want to use.

    Furthermore, you shouldn't see any of the following in your perlbrewed perl's @INC:


    1. Let's clean up your environment.

      1. Unset env vars PERL5LIB, PERLLIB, PERL5OPT, PERL_MM_OPT and PERL_MB_OPT. Permanently. Get rid of them in your login scripts, then unset them from the current shell or log back in. (Make a note of what they were as a backup.)

      2. Clear cpan's configuration item makepl_arg. From within cpan,

        o conf makepl_arg      # Just to see its current value as a backup.
        o conf makepl_arg ''
        o conf commit
        

        In particular, we want to remove anything that indicates an installation path, including INSTALL_BASE, PREFIX and LIB.

      3. Clear cpan's configuration item mbuildpl_arg. From within cpan,

        o conf mbuildpl_arg    # Just to see its current value as a backup.
        o conf mbuildpl_arg ''
        o conf commit
        

        In particular, we want to remove anything that indicates an installation path, including --install_base, --prefix and --lib.

      4. Since you're there, do the following from within cpan:

        o conf build_dir_reuse 0
        o conf commit
        

        This will restore the setting to its default, which will save you headaches if it was changed.

    2. Install the dependencies.

      cpan Dist::Zilla Mouse
      

    At this point, executing which dzil should give

    /Users/user/perl5/perlbrew/perls/perl-5.16.0/bin/dzil
    

    If so, you should be good to go.

    If not, do hash -r and try which dzil again. (This shouldn't be needed, but just to be sure.)

    If still not, provide the output of the following commands:

    echo "$PATH"
    which cpan
    head -n 3 "$( which cpan )"
    echo 'o conf' | cpan | grep arg
    which dzil
    head -n 3 "$( which dzil )"
    perl -V                           # Uppercase "V"