Я хочу установить perl-модули на общий сервер, на котором у меня нет доступа root. Как я могу это сделать? У них также есть более старая версия CPAN (она жалуется на это при запуске этой команды), можно ли обновить команду CPAN, используемую из моей учетной записи, не требуя доступа root?
Как использовать CPAN в качестве пользователя без полномочий root?
Ответ 1
Самый простой способ, который я нашел до сих пор, - сказать
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`' >> ~/.profile
echo 'export MANPATH=$HOME/perl5/man:$MANPATH' >> ~/.profile
Предполагается, что ваш профиль имеет имя .profile
, вам может потребоваться изменить его как .bash_profile
, .bashrc
и т.д. После этого вы можете установить модули, сказав
cpanm Module::Name
и просто используйте их так же, как если бы они были установлены в корневых каталогах.
Далее следует краткое объяснение того, что делают команды выше.
wget -O- http://cpanmin.us
извлекает последнюю версию cpanm
и печатает ее на STDOUT
, которая затем отправляется на perl - -l ~/perl5 App::cpanminus local::lib
. Первый -
сообщает perl
ожидать, что программа войдет в STDIN
, это заставляет perl
запускать версию cpanm
, которую мы только что загрузили. perl
передает остальные аргументы в cpanm
. Аргумент -l ~/perl5
сообщает cpanm
, где устанавливать модули Perl, а два других аргумента - установить два модуля. [App::cpanmins
] 1 - это пакет, устанавливающий cpanm
. local::lib
- это вспомогательный модуль, который управляет переменными среды, необходимыми для запуска модулей в локальном каталоге.
После того, как эти модули установлены, мы запустим
eval `perl -I ~/perl5/lib/perl5 -Mlocal::lib`
установить переменные среды, необходимые для использования локальных модулей, а затем
echo 'eval `perl -I ~/perl5/lib/perl5 -Mlocal::lib`' >> ~/.profile
чтобы мы могли использовать их при следующем входе в систему.
echo 'export MANPATH=$HOME/perl5/man:$MANPATH' >> ~/.profile
мы надеемся, заставит человека найти страницы руководства для ваших локальных модулей.
Ответ 2
http://novosial.org/perl/life-with-cpan/non-root/
Основной шаг в обоих наборах команд включает local:: lib module
AFAIK, логика CPAN содержится в модуле Perl (CPAN.pm), что означает, что вы также можете легко установить новый в своем локальном каталоге, как и с любым другим модулем Perl.
Также, как только вы устанавливаете свои модули в нестандартном месте, проверьте эти два вопроса по загрузке библиотек из нестандартных мест (часть информации уже доступна в ссылке выше):
Как программа Perl знает, где найти файл, содержащий модуль Perl, который он использует?
Как создается Perls @INC? (aka Каковы все способы воздействия на то, где искали модули Perl?)
Ответ 3
Для полноты, это процесс установки cpanm
в OSX, если вы хотите сохранить perl5
под ~/Library
.
curl -L http://cpanmin.us | perl - -l ~/Library/perl5 App::cpanminus local::lib
eval `perl -I ~/Library/perl5/lib/perl5 -Mlocal::lib=~/Library/perl5`
echo 'eval `perl -I ~/Library/perl5/lib/perl5 -Mlocal::lib=~/Library/perl5`' >> ~/.bash_profile
Ответ 4
Если вы хотите читать man-страницы для установленных модулей cpanminus, вы также должны убедиться, что правильный подкаталог выбранного пути библиотеки находится в MANPATH. Поэтому приведенное выше решение, показывающее процесс установки cpanm, нуждается в следующей дополнительной команде:
export MANPATH=$HOME/Library/perl5/man:$MANPATH' >> ~/.bash_profile
Ответ 5
на самом деле это просто копия приведенных выше ответов, но в одном повторно используемом скрипте bash:
#! /usr/bin/env bash │··
│··
# a bash wrapper for check-installing required perl modules as non-root
main(){ │··
doSetVars │··
doCheckInstallPreReqs │··
perl $PRODUCT_INSTANCE_DIR/src/perl/my-perl-script.t │··
} │··
│··
doSetVars(){ │··
#set -x │··
umask 022 ; │··
set -u -o pipefail │··
run_unit_bash_dir=$(perl -e 'use File::Basename; use Cwd "abs_path"; print dirname(abs_path(@ARGV[0]));' -- "$0") │··
export PRODUCT_INSTANCE_DIR=$run_unit_bash_dir/../.. │··
} │··
│··
doCheckInstallPreReqs(){ │··
eval 'perl -I ~/perl5/lib/perl5 -Mlocal::lib' │··
perl -e ' │··
use JSON ; │··
use Data::Printer; │··
use Test::Most ; │··
use Test::Mojo; │··
use Data::Printer ; │··
use FindBin; │··
use JSON::Parse ; │··
use IPC::System::Simple ; │··
use Mojolicious ; │··
' || { │··
curl -L 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 │··
cpanm --local-lib=~/perl5 local::lib && eval $(perl -I ~/perl5/lib/perl5/ -Mlocal::lib) │··
export PERL_MM_USE_DEFAULT=1 │··
cpanm JSON Data::Printer Test::Most Test::Mojo Data::Printer FindBin JSON::Parse \ │··
IPC::System::Simple │··
sudo curl -L cpanmin.us | perl - Mojolicious │··
} │··
│··
} │··
│··
main