我有几台运行Perl程序和其他程序和工具的Linux机器。
我想让机器之间的所有工具保持同步,所以我在一台机器(Main)和其他机器之间共享了/usr/local
目录。
现在我想在/usr/local/<path to modules>
中保持所有Perl模块及其依赖项同步。
我找到了local::lib
模块,但这是为了将模块安装到您的主目录。
如何设置CPAN(或CPAN备选方案)以将所有模块和依赖项安装到一个位置?如何在其他机器上设置Perl以使用该位置来查找模块?
答案 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
通过使用PERL5LIB
或lib或-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
}
}