Як я можу використовувати CPAN як некорневого користувача?


81

Я хочу встановити модулі perl на спільний сервер, на якому я не маю root-доступу. Як я можу це зробити? Вони також мають стару версію CPAN (вона скаржиться на це при запуску команди), чи можливо оновити команду CPAN, яка використовується з мого облікового запису, не вимагаючи кореневого доступу?


Відповіді:


139

Найпростіший метод, який я знайшов дотепер, - це сказати

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

сподіваємось, людина змусить знайти сторінки керівництва для ваших локальних модулів.


+1 для cpanminus ... ніколи не використовував його, тому не можу відчути, що я повинен його рекомендувати, але мені це подобається з того, що я бачив на ТО до сих пір
DVK

7
Для мене це чудово працює. Просто невелика примітка, щоб спершу видалити будь-які існуючі змінні середовища PERL5LIB, які вже є у вашому ~ / .profile (або що завгодно). В іншому випадку local :: lib не вдасться встановити під час запуску першої команди.
Хуан А. Наварро,

@juannavar Хороший момент, я схильний встановлювати його на нещодавно встановлених машинах, тому я не стикаюся з цим випадком.
Час. Owens

Прекрасний приклад використання wget замість curl - багато систем не мають curl за замовчуванням, хоча вони і wget, тому це корисно для тих, хто не має root, щоб встановлювати нові пакети.
AndrewPK

1
@HielkeWalinga Дочірні процеси не можуть змінювати середовище батьківських процесів. Щоб вирішити це, команди типу perl -I ~/perl5/lib/perl5 -Mlocal::libабо ssh-agentякі повинні встановити змінні середовища для батьківського процесу, роздруковують команди, які потрібно запустити в батьківському процесі, а потім вам evalїх. Вам насправді вони не потрібні eval. Можна сказати perl -I ~/perl5/lib/perl5 -Mlocal::lib > /tmp/commands; source /tmp/commands, але метод eval чистіший (немає файлів для очищення або випадкового перезапису).
Час. Оуенс

12

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

Логіка AFAIK, CPAN міститься в модулі Perl (CPAN.pm), що означає, що ви також можете легко встановити новий у свій локальний каталог, як і будь-який інший модуль Perl.


Крім того, як тільки ви встановите свої модулі в нестандартному місці, перегляньте ці два запитання щодо завантаження бібліотек з нестандартних місць (частина інформації вже доступна за посиланням вище):

Звідки програма Perl знає, де знайти файл, що містить модуль Perl, який вона використовує?

Як будується @INC Perl? (aka Які всі способи впливають на те, де шукають модулі Perl?)


Розкриття інформації - Я автор обох запитань щодо SO, зв’язаних у цій відповіді.
DVK

2
Існує щонайменше чотири різні способи встановлення модулів із CPAN: вручну, модуль CPAN (та його еквівалент командного рядка cpan), CPANPLUSмодуль (та еквівалент його командного рядка cpanp) та новий дистрибутив App :: cpanminus, який встановлюється cpanm. Я вважаю, cpanmщо найпростішим для встановлення та використання. cpanі cpanpвстановлюються за замовчуванням, але для коректної роботи вимагають значного налаштування.
Час. Owens

404: На цьому сервері не знайдено запитану URL-адресу / write / articles / install-perl-modules-without-root.
harschware

6

Для повноти це процес інсталяції cpanmOSX, якщо ви хочете залишити 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

2

Якщо ви хочете також мати можливість читати сторінки для модулів, встановлених cpanminus, вам слід також переконатися, що правильний підкаталог вибраного шляху бібліотеки знаходиться в MANPATH. Отже, наведене вище рішення, що демонструє процес встановлення cpanm, потребує наступної додаткової команди:

 export MANPATH=$HOME/Library/perl5/man:$MANPATH' >> ~/.bash_profile

0

ми використовували наступну функцію протягом останніх 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.