Где 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
знаю, где найти модуль.
-
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>
. Она никогда не подводит...