В чем разница между ядром, поставщиком и местоположением сайта в Perl? - PullRequest
0 голосов
/ 01 февраля 2019

Недавно я столкнулся с некоторыми проблемами при установке некоторых модулей и, к своему удивлению, обнаружил, что многие из установленных модулей имеют дублированные установки и версии.Пытаясь отследить, что происходит в стандартной (если есть такая вещь) установке с использованием cpanm, я нашел следующие результаты очень запутанными.

Отчеты показывают эти местоположения:

  • Использование cpan -V:
# cpan -V

/usr/bin/cpan script version 1.672, CPAN.pm version 2.22
--------------------------------------------------
Checking install dirs...
Checking core
        + /usr/share/perl5/5.26
        + /usr/lib/perl5/5.26/x86_64-cygwin-threads
Checking vendor
        + /usr/share/perl5/vendor_perl/5.26
        + /usr/lib/perl5/vendor_perl/5.26/x86_64-cygwin-threads
Checking site
        + /usr/local/share/perl5/site_perl/5.26
        + /usr/local/lib/perl5/site_perl/5.26/x86_64-cygwin-threads
Checking PERL5LIB
        no directories for PERL5LIB
Checking PERLLIB
        no directories for PERLLIB
  • Использование perl -V:.*site.*:
# perl -V:.*site.* |column -t -s "=" |sort -d -i -k 1.22

d_sitearch           'define';
usesitecustomize     'undef';
siteprefix           '/usr/local';
siteprefixexp        '/usr/local';
installsitebin       '/usr/local/bin';
installsitescript    '/usr/local/bin';
sitebin              '/usr/local/bin';
sitebinexp           '/usr/local/bin';
sitescript           '/usr/local/bin';
sitescriptexp        '/usr/local/bin';
installsitearch      '/usr/local/lib/perl5/site_perl/5.26/x86_64-cygwin-threads';
sitearch             '/usr/local/lib/perl5/site_perl/5.26/x86_64-cygwin-threads';
sitearchexp          '/usr/local/lib/perl5/site_perl/5.26/x86_64-cygwin-threads';
installsitehtml1dir  '/usr/local/share/doc/perl/html/html1';
sitehtml1dir         '/usr/local/share/doc/perl/html/html1';
sitehtml1direxp      '/usr/local/share/doc/perl/html/html1';
installsitehtml3dir  '/usr/local/share/doc/perl/html/html3';
sitehtml3dir         '/usr/local/share/doc/perl/html/html3';
sitehtml3direxp      '/usr/local/share/doc/perl/html/html3';
installsiteman1dir   '/usr/local/share/man/man1';
siteman1dir          '/usr/local/share/man/man1';
siteman1direxp       '/usr/local/share/man/man1';
installsiteman3dir   '/usr/local/share/man/man3';
siteman3dir          '/usr/local/share/man/man3';
siteman3direxp       '/usr/local/share/man/man3';
installsitelib       '/usr/local/share/perl5/site_perl/5.26';
sitelib              '/usr/local/share/perl5/site_perl/5.26';
sitelib_stem         '/usr/local/share/perl5/site_perl/5.26';
sitelibexp           '/usr/local/share/perl5/site_perl/5.26';
  • Использование @INC:
# perl -e 'print join("\n",@INC,"")'

/usr/local/lib/perl5/site_perl/5.26/x86_64-cygwin-threads
/usr/local/share/perl5/site_perl/5.26
/usr/lib/perl5/vendor_perl/5.26/x86_64-cygwin-threads
/usr/share/perl5/vendor_perl/5.26
/usr/lib/perl5/5.26/x86_64-cygwin-threads
/usr/share/perl5/5.26

В результате cpan-outdated -p --verbose показывает совершенно другой (и более короткий) список устаревших модулей, чем cpan -lO.Излишне говорить, что модули устанавливаются повсеместно, и я не понимаю, как понять, есть ли место установки по умолчанию и куда оно идет, или должно пойти.


ВОПРОС :

  1. Так в чем же разница между core, vendor и site типом путей?
  2. Почему в каждом типе 2 пути?

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

ОБНОВЛЕНИЕ :

Благодаря SO * ссылке ikegami , с тех пор я просмотрел некоторые источники, где мы можем найти много информации об этом.Чтобы получить более конкретные местоположения:

# perl -V:'install(privlib|archlib|vendorlib|vendorarch|sitelib|sitearch)' |column -t -s "="

installarchlib     '/usr/lib/perl5/5.26/x86_64-cygwin-threads';
installprivlib     '/usr/share/perl5/5.26';
installsitearch    '/usr/local/lib/perl5/site_perl/5.26/x86_64-cygwin-threads';
installsitelib     '/usr/local/share/perl5/site_perl/5.26';
installvendorarch  '/usr/lib/perl5/vendor_perl/5.26/x86_64-cygwin-threads';
installvendorlib   '/usr/share/perl5/vendor_perl/5.26';

Затем, чтобы понять их значение, мы можем посмотреть (в источниках perl) в файле: ./Porting/Glossary:

installarchlib    '- is the same for modules with arch- or build-dependent components.'
installprivlib    '- contains the "pure Perl" modules that came with Perl.'
installsitearch   '- is the same for modules with arch- or build-dependent components.'
installsitelib    '- contains the "pure Perl" modules installed by you.'
installvendorarch '- is the same for modules with arch- or build-dependent components.'
installvendorlib  '- contains the "pure Perl" modules installed by your distro.'

сдополнительное интересное примечание об опции installstyle :

installstyle (installstyle.U):

Эта переменная описывает стиль установки perl.Предполагается, что это будет полезно для инструментов, которые должны манипулировать целыми дистрибутивами Perl.Сам Perl не использует это для поиска своих библиотек - каталоги библиотек хранятся непосредственно в Config.pm.В настоящее время существует только два стиля: lib и lib/perl5.Расположение библиотеки по умолчанию (например, privlib, sitelib): $prefix/lib или $prefix/lib/perl5.Первый полезен, если $ prefix - это каталог, выделенный для perl (например, / opt / perl), а второй полезен, если префикс $ используется многими пакетами, например, если $prefix=/usr/local.

К сожалению, хотя эта переменная «style» используется для установки значений по умолчанию для всех трех иерархий каталогов (ядро, поставщик и сайт), нет гарантии, что один и тот же стиль действительно подходит для всех этих каталогов.Например, префикс $ может быть / opt / perl, но $siteprefix может быть / usr / local.(Возможно, ретроспективно, стиль "lib" никогда не должен был поддерживаться, но в то время это казалось хорошей идеей.)

Ситуация еще менее ясна для таких инструментов, как MakeMaker, которые могут бытьиспользуется для установки дополнительных модулей в нестандартных местах.Например, если пользователь намеревается установить модуль в частный каталог (возможно, установив PREFIX в командной строке Makefile.PL), то нет никаких оснований предполагать, что параметр Configure-time $ installstyle будет релевантным для этого PREFIX..

Позже это может быть расширено, чтобы включить другую информацию, поэтому будьте осторожны с сопоставлением с шаблоном результатов.

Для совместимости с perl5.005 и более ранними версиями настройка по умолчанию основана на том,или нет префикс $ содержит строку «perl».

Все подробности можно найти в файле INSTALLATION под заголовком Installation Directories.

  • Directories for the perl distribution:
    По умолчанию Configure будет использовать следующие каталоги (5.28.1):

        Configure variable  Default value
        $prefixexp          /usr/local
        $binexp             $prefixexp/bin
        $scriptdirexp       $prefixexp/bin
        $privlibexp         $prefixexp/lib/perl5/$version
        $archlibexp         $prefixexp/lib/perl5/$version/$archname
    
  • Directories for site-specific add-on files:

       Configure        Default
       variable          value
     $siteprefixexp    $prefixexp
     $sitebinexp       $siteprefixexp/bin
     $sitescriptexp    $siteprefixexp/bin
     $sitelibexp       $siteprefixexp/lib/perl5/site_perl/$version
     $sitearchexp      $siteprefixexp/lib/perl5/site_perl/$version/$archname
    
  • Directories for vendor-supplied add-on files:

    Если вы создаете бинарный дистрибутив perl для распространения, Configure может дополнительно настроить следующие каталоги для вас:используется для распространения дополнительных модулей.

       Configure          Default
       variable            value
     $vendorprefixexp    (none)
    
     (The next ones are set only if vendorprefix is set.)
    
     $vendorbinexp       $vendorprefixexp/bin
     $vendorscriptexp    $vendorprefixexp/bin
     $vendorlibexp       $vendorprefixexp/lib/perl5/vendor_perl/$version
     $vendorarchexp      $vendorprefixexp/lib/perl5/vendor_perl/$version/$archname
    
  • otherlibdirs:
    В качестве окончательного универсального средства Configure также предлагает переменную $otherlibdirs.Эта переменная содержит список дополнительных каталогов, разделенных двоеточиями, которые нужно добавить в @ INC .По умолчанию он будет пустым.

  • APPLLIB_EXP:
    Существует еще один способ добавления путей к @INC во время сборки perl, а именно путем установки токена препроцессора APPLLIB_EXP C.Каталоги, определенные APPLLIB_EXP, добавляются в @INC сначала , опережая все остальные.
    sh Configure -Accflags='-DAPPLLIB_EXP=\"/usr/libperl\"'

0 голосов
/ 01 февраля 2019

Лучшим справочником для этих мест установки, вероятно, является документация ExtUtils :: MakeMaker , в которой он устанавливает объекты.По сути:

  • core (также известный как privlib ) - это то место, куда идут основные модули, установленные с Perl.На Perls старше 5.12 обновления для модулей с двойным сроком службы также необходимо устанавливать здесь поверх основных версий, а не в lib сайта или вендора, потому что privlib появился первым в @INC до 5.12.Это особенно опасно в системном Perl, где файлы в privlib обычно управляются менеджером пакетов.
  • vendor - это место, куда поставщик дистрибутива может устанавливать модули.Это обычно, где системные менеджеры пакетов устанавливают неосновные модули в.
  • site - это то место, куда клиенты CPAN устанавливают модули при прямом вызове, за исключением необычной конфигурации, как для модулей с двойным сроком службыкак упомянуто выше.

(Модули с двойным сроком службы - это основные модули, которые также доступны отдельно в CPAN, что означает, что вы можете установить обновленную версию.)

Каждый из этих libместоположения имеют вариант arch, в который устанавливаются дистрибутивы с выходными файлами для конкретной сборки.Дистрибутивы Pure-Perl без динамической конфигурации устанавливаются в стандартный каталог, независимый от архитектуры, и обычно могут работать без изменений в других установках Perl и архитектур при условии, что их требования все еще удовлетворены (хотя это не очень хорошая идея, если вы действительно не знаете, кто выделать). Дистрибутивы с любыми скомпилированными модулями XS или динамически генерирующими модули в процессе сборки устанавливаются в каталог arch и не безопасны для использования с другого Perl.

Все эти расположениянастраивается при сборке Perl и может быть обнаружен с помощью опции perl -V, как вы показали.Каждый из них также имеет сопровождающие каталоги script и bin (которые обычно одинаковы) и каталоги для страниц man.

Что касается несоответствия cpan-outdated - этот инструмент (как и многие инструменты, использующие )ExtUtils :: Installed ) ограничен поиском модулей, которые имеют packlists , которые включаются при установке модуля с использованием клиента CPAN, но не с базовыми модулями, и они, как правило, извлекаются из пакетов поставщиков.Поэтому, скорее всего, cpan-outdated обнаружит модули только в sitelib , но это обычно все, что вам нужно найти.Я не уверен, какой механизм использует команда cpan.

...