Как я могу использовать CPAN как пользователь без полномочий root?
Я хочу установить модули Perl на общий сервер, на котором у меня нет прав root. Как я могу это сделать? Похоже, что они также имеют более старую версию CPAN (она жалуется на это при запуске команды), возможно ли обновить команду CPAN, используемую из моей учетной записи, не требуя root-доступа?
4 ответа
Самый простой метод, который я нашел, это сказать
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
будем надеяться, что man найдет справочные страницы для ваших локальных модулей.
http://novosial.org/perl/life-with-cpan/non-root/
Основным шагом в обоих наборах инструкций является модуль local::lib
AFAIK, логика CPAN содержится в модуле Perl (CPAN.pm), что означает, что вы также можете легко установить более новый в локальном каталоге, как и в любом другом модуле Perl.
Кроме того, после установки модулей в нестандартном месте, проверьте эти два вопроса о загрузке библиотек из нестандартных мест (некоторая информация уже доступна по ссылке выше):
Как Perl-программа узнает, где найти файл, содержащий модуль Perl, который она использует?
Как создается Perl @INC? (ака, как все это влияет на поиск модулей Perl?)
Для полноты, это процесс установки 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
Если вы хотите иметь возможность читать man-страницы для модулей, установленных cpanminus, вы также должны убедиться, что правильный подкаталог выбранного пути к библиотеке находится в MANPATH. Таким образом, вышеприведенное решение, показывающее процесс установки cpanm, требует следующей дополнительной команды:
export MANPATH=$HOME/Library/perl5/man:$MANPATH' >> ~/.bash_profile
Мы использовали следующую функцию в течение последних 6 месяцев в более чем 20 развертываниях, успешных автоматических развертываниях на aws ... вызываемых из основной подготовки следующим образом, что в основном является просто копией ответов, приведенных выше, но за один раз пригодный для использования сценарий 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