Где CPAN устанавливает модули?

Я не могу найти авторитетное/полное описание того, где CPAN устанавливает свои файлы. Я предполагаю, что должен быть набор правил и что это не так просто, как "каталог XYZ", потому что, например, несколько пользователей в окне Linux могут запускать CPAN, даже если есть одна установка Perl, и она все еще каким-то образом работает. Так что это за правила?

вторая часть этого вопроса: документация для переменной среды PERL5LIB говорит, что это " список каталогов в котором искать файлы библиотеки Perl, прежде чем искать в стандартной библиотеке и текущем каталоге."

Я предполагаю, что CPAN не устанавливается в стандартное расположение библиотеки, так как предположительно это исправлено для конкретной версии Perl. Так может CPAN устанавливается в PERL5LIB?

и, наконец, как я уже упоминал, как CPAN обрабатывает тот факт, что несколько пользователей могут запускать одну и ту же установку Perl? Извините, если это отдельный вопрос, но похоже возможно, родственники.

3 ответов


Perl указывает три набора мест установки.

  • perl, для модулей, включенных в Perl.
  • vendor, для модулей, установленных поставщиком вашей perl бинарный.
  • site, для модулей, установленных с помощью cpan.

каждый из этих наборов предоставляет места установки для нескольких типов файлов.

                        Installation location
                        --------------------------------------------------------
Type of file            perl             vendor                 site
----------------------  ---------------  ---------------------  -------------------
Build-specific modules  installarchlib   installvendorarch      installsitearch
Modules                 installprivlib   installvendorlib       installsitelib
Binary programs         installbin       installvendorbin       installsitebin
Other programs          installscript    installvendorscript    installsitescript
man pages for scripts   installman1dir   installvendorman1dir   installsiteman1dir
man pages for modules   installman3dir   installvendorman3dir   installsiteman3dir
html docs for scripts   installhtml1dir  installvendorhtml1dir  installsitehtml1dir
html docs for modules   installhtml3dir  installvendorhtml3dir  installsitehtml3dir

вы можете получить путь для любого из этих мест с помощью следующее:

perl -V:{var}

вы можете получить все пути, для этих мест, используя следующие кнопки:

perl -V:'install.*'

это значения по умолчанию, используемые установщиками[1]. Однако два наиболее часто используемых установщика позволяют пользователю, выполняющему установку, переопределить любой из них. Если модуль установлен в нестандартном месте, PERL5LIB к perl знаю, где найти модуль.


  1. CPAN не устанавливает модули. Это хранилище.

    cpan не установите модули. cpan скачать дистрибутивы из CPAN и запускает программу установки, предусмотренную в,Makefile.PL и Build.PL. (То же самое касается cpanm и cpanp.)

    эти скрипты в основном использовать ExtUtils::MakeMaker или Module:: Build установите сами (хотя другие установщики существовать.)


CPAN фактически не устанавливает файлы. Он запускает сценарий установки, встроенный в каждый дистрибутив, который затем выполняет фактическую установку.

для дистрибутивов с использованием ExtUtils::MakeMaker настройки по умолчанию описаны здесь: https://metacpan.org/pod/ExtUtils::MakeMaker#make-install (и значение по умолчанию INSTALLDIRS is site). Для Module:: Build см. https://metacpan.org/pod/Module::Build#INSTALL-PATHS.

когда документация говорит о $Config{foo} или %Config, это значит %Config переменной, представленной модуль конфигурации. Значение $Config{foo} может также быть проверено путем бег perl -V:foo.

(если вы думаете, что это кажется излишне сложным, вы правы.)

короткая версия заключается в том, что perl имеет несколько "системных каталогов", один из которых предназначен для " сайта конкретные " модули и, таким образом, используются в качестве цели установки по умолчанию. Вы правы, что это один каталог (на perl install), который не хорошо сочетается с многопользовательской системой: он используется всеми пользователями, и вам нужны разрешения root для установки модулей (и это может обновить/переопределить модули из системных пакетов, что является плохой идеей).

вместо этого люди настраивают ExtUtils::MakeMaker, Module:: Build и т. д. Для установки в домашний каталог пользователя. Этот можно сделать с переменными среды. Затем они говорят perl добавить этот каталог в @INC, поэтому модули можно найти и загрузить. Это делается с другой переменной среды,PERL5LIB. (PERL5LIB не влияет на установку, он чисто используется для загрузки.)

все вышеперечисленное автоматизировано и инкапсулировано в local:: lib. (local::lib также можно использовать, например, для создания подкаталога модуля для каждого проекта.)

документация CPAN также говорит:

начиная с CPAN 1.9463, если у вас нет разрешения на запись каталогов библиотеки perl по умолчанию, процесс настройки CPAN спросит вас, Хотите ли вы bootstrap local::lib, что упрощает ведение личного каталога библиотеки perl.


вы можете обойти всю проблему, установив частный perl в свой домашний каталог (в этом случае каталог "system" - это просто еще один подкаталог под вашим $HOME и таким образом не делится ни с кем и может быть написано вами). Это очень легко, например,perlbrew.


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


это сложный вопрос. Вы можете сказать, где базовый библиотеки расположены, ища место одного из них:

perldoc -l B

скажет вам, где базовый модуль. И вы можете попробовать другие с другими результатами...

и perl -V расскажет вам все переменные оболочки, которые имеют значение вместе со значением @INC, места, где он будет искать библиотеки.

базовый библиотеки обычно найдено в разных местах, чем местные библиотеки. Кроме того, если вы используете perlbrew и local::lib у вас может быть больше вещей, чтобы рассмотреть. Что касается переменных оболочки, наряду с PERL5LIB, у вас также есть PERL_LOCAL_LIB_ROOT.

что касается вашего другого вопроса, я бы сказал, что root может устанавливать библиотеки в масштабах всей системы. Любой пользователь будет иметь те, а затем любые локальные места, включенные с помощью переменных оболочки или других средств, таких как параметры командной строки perl -I <lib location>, или в код типа use lib <lib location>;.

есть еще perlbrew который вместе с local::lib позволяет непривилегированному пользователю установить Perl и библиотеки в местных каталогах.

что касается способов установки модулей из CPAN, мой любимый cpanminus. Он вызывается с помощью cpanm <library to install>. Она никогда не подводит...