В чем разница между расположением ядра, поставщика и сайта в Perl?

Недавно я столкнулся с некоторыми проблемами при установке некоторых модулей и, к своему удивлению, обнаружил, что многие из установленных модулей имеют повторяющиеся установки и версии. Пытаясь отследить, что происходит при стандартной (если есть) установке с помощью 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 пути?

person not2qubit    schedule 31.01.2019    source источник
comment
Ответил это   -  person ikegami    schedule 01.02.2019
comment
@ikegami Спасибо! (Я бы никогда не нашел его под этим вопросом.)   -  person not2qubit    schedule 01.02.2019


Ответы (2)


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

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

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

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

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

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

person Grinnz    schedule 31.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 используется многими пакетами, например если $prefix=/usr/local.

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

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

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

Для совместимости с perl 5.005 и более ранними версиями значение по умолчанию зависит от того, содержит ли $prefix строку «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\"'

person not2qubit    schedule 01.02.2019