Как построен Perl @INC? (aka каковы все способы влияния на то, где ищутся модули Perl?)



каковы все способы влияния на поиск модулей Perl?
или, Как построен Perl @INC?



Как известно, Perl использует @INC массив, содержащий имена каталогов, чтобы определить, где искать файлы модуль Perl.



похоже, что на StackOverflow нет исчерпывающего сообщения типа FAQ "@INC", поэтому этот вопрос предназначен как один.

953   3  

3 ответов:

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

  1. по умолчанию @INC

    интерпретатор Perl является составлен с конкретным @INC значение по умолчанию. Чтобы узнать это значение, запустите (env -i игнорировать PERL5LIB переменная окружения-см. #2) и на выходе вы увидите что-то вроде это:

    $ env -i perl -V
    ...
    @INC:
     /usr/lib/perl5/site_perl/5.18.0/x86_64-linux-thread-multi-ld
     /usr/lib/perl5/site_perl/5.18.0
     /usr/lib/perl5/5.18.0/x86_64-linux-thread-multi-ld
     /usr/lib/perl5/5.18.0
     .
    

Примечание . в конце; это текущий каталог (который не обязательно совпадает с скрипт каталог). Он отсутствует в Perl 5.26+, и когда Perl работает с -T (проверка заражения включена).

чтобы изменить путь по умолчанию при настройке двоичной компиляции Perl, установите параметр конфигурации otherlibdirs:

Configure -Dotherlibdirs=/usr/lib/perl5/site_perl/5.16.3

  1. переменные среды PERL5LIB (или PERLLIB)

    Perl pre-pends @INC со списком каталогов (разделенных двоеточием), содержащегося в PERL5LIB (если он не определен, PERLLIB используется) переменная окружения вашей оболочки. Чтобы увидеть содержимое @INC после PERL5LIB и PERLLIB переменные среды вступили в силу, запустите perl -V.

    $ perl -V
    ...
    %ENV:
      PERL5LIB="/home/myuser/test"
    @INC:
     /home/myuser/test
     /usr/lib/perl5/site_perl/5.18.0/x86_64-linux-thread-multi-ld
     /usr/lib/perl5/site_perl/5.18.0
     /usr/lib/perl5/5.18.0/x86_64-linux-thread-multi-ld
     /usr/lib/perl5/5.18.0
     .
    
  2. Perl pre-pends @INC со списком каталогов (разделенных двоеточием) передается как значение . Это можно сделать тремя способами, как обычно с вариантами Перл:

    • передайте его в командной строке:

      perl -I /my/moduledir your_script.pl
      
    • передайте его через первую строку (shebang) вашего Perl сценарий:

      #!/usr/local/bin/perl -w -I /my/moduledir
      
    • передайте его как часть PERL5OPT (или PERLOPT) переменной окружения (см. главу 19.02 в Программирование На Perl)

  3. передайте его через lib pragma

    Perl pre-pends @INC со списком каталогов, переданных в него через use lib.

    в программе:

    use lib ("/dir1", "/dir2");
    

    в командной линия:

    perl -Mlib=/dir1,/dir2
    

    вы можете удалить каталоги от @INC через no lib.

  4. вы можете непосредственно манипулировать @INC как обычный массив Perl.

    Обратите Внимание:@INC используется на этапе компиляции, это должно быть сделано внутри BEGIN {} блок, который предшествует use MyModule заявление.

    • добавить каталоги в начало через unshift @INC, $dir.

    • добавить каталоги в конец через push @INC, $dir.

    • сделайте все, что вы можете сделать с массивом Perl.

Примечание: директории unshifted на @INC в порядке, указанном в этом ответе, например, по умолчанию @INC является последним в списке, перед PERL5LIB, предшествуют -I, предшествуют use lib и направить @INC манипуляции, последние два смешанные в любом порядке они находятся в коде Perl.

ссылки:

там не кажется, чтобы быть всеобъемлющим @INC FAQ-тип сообщения о переполнении стека, поэтому этот вопрос предназначен как один.

когда использовать каждый подход?

  • если модули в каталоге должны использоваться многими / всеми скриптами на вашем сайте, особенно запущенными несколькими пользователями, этот каталог должно быть включено в значение по умолчанию @INC компилируется в двоичный файл Perl.

  • если модули в каталоге будут использоваться исключительно определенным пользователем для всех сценариев, которые запускает пользователь (или если перекомпиляция Perl не является опцией для изменения default @INC в предыдущем случае использования), установите пользователей PERL5LIB, обычно во время входа пользователя.

    Примечание: пожалуйста, имейте в виду обычные подводные камни переменной среды Unix-например, в некоторых случаях работает скрипты как конкретный пользователь не гарантируют их выполнение с настроенной средой этого пользователя, например, через su.

  • если модули в каталоге необходимо использовать только в определенных обстоятельствах (например, когда скрипт(ы) выполняется в режиме разработки/отладки, вы можете установить PERL5LIB вручную, или пройти -I опция для perl.

  • если модули должны использоваться только для определенных сценариев, по все пользователи, использующие их, используйте use lib/no lib прагмы в самой программе. Он также должен использоваться, когда каталог для поиска должен быть динамически определен во время выполнения - например, из параметров командной строки скрипта или пути скрипта (см. FindBin модуль для очень хорошего случая использования).

  • если каталоги в @INC нужно манипулировать в соответствии с какой-то сложной логикой, либо невозможно тоже громоздко реализовать комбинацией use lib/no lib прагмы, затем используйте direct @INC манипуляции внутри BEGIN {} блок или внутри библиотеки специального назначения, предназначенной для @INC манипуляции, которые должны использоваться вашим скриптом(АМИ) перед использованием любых других модулей.

    примером этого является автоматическое переключение между библиотеками в каталогах prod/uat/dev, с помощью waterfall library pickup в prod, если он отсутствует в dev и / или UAT (последнее условие делает стандартное решение "use lib + FindBin" довольно сложное. Подробная иллюстрация этого сценария находится в как использовать модули beta Perl из сценариев beta Perl?.

  • дополнительный вариант использования для непосредственного управления @INC должна быть возможность добавлять ссылки на подпрограммы или ссылки на объекты (да, Вирджиния,@INC может содержать пользовательский код Perl, а не только имена каталогов, как описано в когда ссылка на подпрограмму в @INC называется?).

в дополнение к расположениям, перечисленным выше, версия OS X Perl также имеет еще два способа:

  1. файл/Library/Perl/x.xx / AppendToPath. Пути, перечисленные в этом файле, добавляются в @INC во время выполнения.

  2. файл/Library/Perl/x.xx / PrependToPath. Пути, перечисленные в этом файле, добавляются к @INC во время выполнения.

как уже было сказано, @INC-это массив, и вы можете добавить все, что хотите.

мой скрипт CGI REST выглядит так:

#!/usr/bin/perl
use strict;
use warnings;
BEGIN {
    push @INC, 'fully_qualified_path_to_module_wiht_our_REST.pm';
}
use Modules::Rest;
gone(@_);

подпрограмма gone экспортируется Rest.pm.

Comments

    Ничего не найдено.