将 Perl 模块安装到特定位置
Installing Perl modules to a specific location
我有几台 Linux 机器 运行 Perl 程序和其他程序和工具。
我想让机器之间的所有工具保持同步,所以我在一台机器(主)和其他机器之间共享了 /usr/local
目录。
现在我想在 /usr/local/<path to modules>
中保持所有 Perl 模块及其依赖项同步。
我找到了 local::lib
模块,但这是为了将模块安装到您的主目录。
如何设置 CPAN(或 CPAN 替代方案)以将所有模块和依赖项安装到一个位置?我如何在其他机器上设置 Perl 以使用该位置查找模块?
根据我自己之前在 local::lib
上的不愉快经历,您应该能够通过在 PERL_MM_OPT
中设置 INSTALL_BASE
来设置模块的安装位置,最有可能的是 [=22] =] 类似的命令:
export PERL_MM_OPT='INSTALL_BASE=/usr/local/<path to modules>'
或者,如果您手动执行 Makefile/make/make test/make 安装过程而不是使用 CPAN 工具链,您可以将 --install_base=/usr/local/<path to modules>
作为参数传递给 Makefile.PL
.
为了方便起见,让我们将基本位置分配给一个变量:(除了以下命令外,此变量不被任何其他人使用。实际上没有必要 export
它。)
export PERL_BASE="/usr/local/perl" # Or "$HOME" or whatever
指示 ExtUtils::MakeMaker 安装位置:(假设 $PERL_BASE
不包含任何 shell 元字符)
export PERL_MM_OPT="INSTALL_BASE=$PERL_BASE"
指示 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}"
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 安装程序可以像 local::lib 一样安装到任何位置,无论您的环境是如何配置的(无论是通过 local::lib 还是其他方式):
cpanm -l /opt/perllib Some::Module
您可以使用任何 local::lib 安装而无需启用它,方法是使用 PERL5LIB
或 lib 或 -I
开关添加 lib 目录,并使用local::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
您可以使用以下 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
}
}
我有几台 Linux 机器 运行 Perl 程序和其他程序和工具。
我想让机器之间的所有工具保持同步,所以我在一台机器(主)和其他机器之间共享了 /usr/local
目录。
现在我想在 /usr/local/<path to modules>
中保持所有 Perl 模块及其依赖项同步。
我找到了 local::lib
模块,但这是为了将模块安装到您的主目录。
如何设置 CPAN(或 CPAN 替代方案)以将所有模块和依赖项安装到一个位置?我如何在其他机器上设置 Perl 以使用该位置查找模块?
根据我自己之前在 local::lib
上的不愉快经历,您应该能够通过在 PERL_MM_OPT
中设置 INSTALL_BASE
来设置模块的安装位置,最有可能的是 [=22] =] 类似的命令:
export PERL_MM_OPT='INSTALL_BASE=/usr/local/<path to modules>'
或者,如果您手动执行 Makefile/make/make test/make 安装过程而不是使用 CPAN 工具链,您可以将 --install_base=/usr/local/<path to modules>
作为参数传递给 Makefile.PL
.
为了方便起见,让我们将基本位置分配给一个变量:(除了以下命令外,此变量不被任何其他人使用。实际上没有必要 export
它。)
export PERL_BASE="/usr/local/perl" # Or "$HOME" or whatever
指示 ExtUtils::MakeMaker 安装位置:(假设 $PERL_BASE
不包含任何 shell 元字符)
export PERL_MM_OPT="INSTALL_BASE=$PERL_BASE"
指示 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}"
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 安装程序可以像 local::lib 一样安装到任何位置,无论您的环境是如何配置的(无论是通过 local::lib 还是其他方式):
cpanm -l /opt/perllib Some::Module
您可以使用任何 local::lib 安装而无需启用它,方法是使用 PERL5LIB
或 lib 或 -I
开关添加 lib 目录,并使用local::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
您可以使用以下 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
}
}