将Perl模块安装到特定位置

时间:2017-01-07 22:01:18

标签: linux perl perl-module cpan

我有几台运行Perl程序和其他程序和工具的Linux机器。

我想让机器之间的所有工具保持同步,所以我在一台机器(Main)和其他机器之间共享了/usr/local目录。

现在我想在/usr/local/<path to modules>中保持所有Perl模块及其依赖项同步。

我找到了local::lib模块,但这是为了将模块安装到您的主目录。

如何设置CPAN(或CPAN备选方案)以将所有模块和依赖项安装到一个位置?如何在其他机器上设置Perl以使用该位置来查找模块?

4 个答案:

答案 0 :(得分:3)

为了方便起见,让我们将基本位置分配给变量:(除了以下命令之外,不使用此var。实际上不需要export它。)

export PERL_BASE="/usr/local/perl"   # Or "$HOME" or whatever

指示ExtUtils :: MakeMaker安装位置:(这假定$PERL_BASE不包含任何shell元字符)

export PERL_MM_OPT="INSTALL_BASE=$PERL_BASE"

Instruct Module :: Build安装位置:(假设$PERL_BASE不包含任何shell元字符)

export PERL_MB_OPT="--install_base $PERL_BASE"

指示Perl在哪里查找模块:(这假定$PERL_BASE不包括:

export PERL5LIB="$PERL_BASE/lib/perl5"

指导系统查找脚本的位置:(假设$PERL_BASE不包含:

export PATH="$PERL_BASE/bin${PATH:+:$PATH}"

指导系统查找手册页的位置:(这假定$PERL_BASE不包括:

export MANPATH="$PERL_BASE/man${MANPATH:+:$MANPATH}"

所有在一起:

export PERL_BASE="/usr/local/perl"
export PERL_MM_OPT="INSTALL_BASE=$PERL_BASE"
export PERL_MB_OPT="--install_base $PERL_BASE"
export PERL5LIB="$PERL_BASE/lib/perl5"
export PATH="$PERL_BASE/bin${PATH:+:$PATH}"
export MANPATH="$PERL_BASE/man${MANPATH:+:$MANPATH}"

答案 1 :(得分:0)

基于我之前使用local::lib的错误行为,您应该能够通过在INSTALL_BASE中设置PERL_MM_OPT来设置模块的安装位置,最有可能的方法是运行类似于:

export PERL_MM_OPT='INSTALL_BASE=/usr/local/<path to modules>'

或者,如果您手动执行Makefile / make / make test / make install过程而不是使用CPAN工具链,则可以将--install_base=/usr/local/<path to modules>作为参数传递给Makefile.PL。< / p>

答案 2 :(得分:0)

local::lib可以在任何位置设置,位置~/perl5仅是默认设置:

# set up PERL_MM_OPT, PERL_MB_OPT, PERL5LIB, and other shell variables
eval "$(perl -I/opt/perllib/lib/perl5 -Mlocal::lib=/opt/perllib)"

cpanm CPAN安装程序可以安装到任何位置,就好像它是本地:: lib一样,无论您的环境如何配置(无论是通过local :: lib还是其他方式):

cpanm -l /opt/perllib Some::Module

通过使用PERL5LIBlib-I开关添加lib目录,并使用可执行文件的路径,可以启用任何local :: lib安装而无需启用它如果需要,请在本地:: lib bin目录中

PERL5LIB=/opt/perllib/lib/perl5 /path/to/script.pl
perl -Mlib=/opt/perllib/lib/perl5 ./script.pl
perl -I/opt/perllib/lib/perl5 /opt/perllib/bin/mojo version

答案 3 :(得分:-1)

您可以使用以下 bash func ...

 do_check_install_perl_modules(){

      
     local_perl5dir=~/perl5
     bash_opts_file=~/.bashrc

     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`' >> ~/.bashrc
     echo 'export MANPATH=$HOME/perl5/man:$MANPATH' >> ~/.bashrc

     modules="$(cat ${BASH_SOURCE/.func.sh/.lst})"
     while read -r module ; do use_modules="${use_modules:-} use $module ; "; done < <(echo "$modules");

     perl -e "$use_modules" || {
        echo "deploying modules. This WILL at least 4 min, but ONLY ONCE !!!"
        test "$(grep -c 'Mlocal::lib' $bash_opts_file|xargs)" -eq 0 && \
           echo 'eval $(perl -I$HOME/perl5/lib/perl5 -Mlocal::lib)' >> $bash_opts_file
                  while read -r module ; do cpanm_modules="${cpanm_modules:-} $module " ; done < <(echo "$modules")
       
       cmd="cpanm --local-lib=$local_perl5dir $modules"
        $cmd
        set +e
                  }
  }