Как использовать CPAN в качестве пользователя без полномочий root?

Я хочу установить perl-модули на общий сервер, на котором у меня нет доступа root. Как я могу это сделать? У них также есть более старая версия CPAN (она жалуется на это при запуске этой команды), можно ли обновить команду 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://web.archive.org/web/20120427144232/http://perl.jonallen.info/writing/articles/install-perl-modules-without-root

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