PERL5LIB, @INC и приоритет библиотеки для тестирования - PullRequest
1 голос
/ 10 мая 2019

У меня были некоторые трудности с переопределением perl lib при тестировании perl-кодов, когда .pl или .pm имеет use lib или unshift @INC, мой вопрос:

Это плохоИдея использовать use lib или unshift @INC в рабочем коде, так как их сложно протестировать?prove -lvr также не может их переопределить.

Код test.pl

push @INC, '/push/inc/lowest_priority';
use lib "/top/priority/use/lib/second_priority";
unshift @INC, "/unshift/inc/lib/first_priority";
foreach my $inc (@INC){
    print "INC=>$inc\n";
}

set perl env

export PERL5LIB=/export/PERL5LIB/env/lib:$PERL5LIB

Выход perl -I/cmd/Iinclude/lib/ test.pl

INC=>/unshift/inc/lib/first_priority
INC=>/top/priority/use/lib/second_priority
INC=>/cmd/Iinclude/lib/
INC=>/export/PERL5LIB/env/lib
INC=>/usr/local/lib64/perl5
INC=>/usr/local/share/perl5
INC=>/usr/lib64/perl5/vendor_perl
INC=>/usr/share/perl5/vendor_perl
INC=>/usr/lib64/perl5
INC=>/usr/share/perl5
INC=>/push/inc/lowest_priority

Ответы [ 2 ]

3 голосов
/ 10 мая 2019

Я не пишу пути жестко, если у меня нет других опций.

В общем, вы не хотите жестко кодировать вещи, которые вы можете предоставить своей программе другим способом, чтобы она могла отвечатьв какой бы среде он ни находился, а не только в той среде, в которой вы его разработали.Одной из таких сред может быть ваша среда тестирования.

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

И, поскольку вы жестко их кодируете и добавляете во время выполнения, они будут следовать за всем, что вы установили ранее.Вот что происходит в ваших настройках:

  • Вы начинаете со значения по умолчанию @INC.
  • Вы начинаете "запускать" вашу программу, вы начинаете фазу компиляции.Он компилирует всю программу перед выполнением инструкций времени выполнения.
  • При компиляции он встречает use lib и немедленно выполняет эту прагму.Теперь /top/priority/use/lib/second_priority находится в начале @INC.
  • Для остальной части фазы компиляции /top/priority/use/lib/second_priority - это первое, что есть в @INC.Вот где последующие вызовы use будут искать вещи.
  • Фаза компиляции заканчивается, и программа переходит в фазу выполнения.
  • Она встречает push и выполняет ее.Теперь /push/inc/lowest_priority является последним элементом @INC.
  • Он пропускает use lib, потому что фаза компиляции обрабатывает прагму.
  • Он встречает unshift и выполняет его.Теперь /unshift/inc/lib/first_priority является первым элементом в @INC.
  • Последующие require вызовы (функция времени выполнения) будут сначала выглядеть как /unshift/inc/lib/first_priority.

Я незнать, где вы ожидаете найти библиотеку, которую ожидаете загрузить, но вам необходимо указать полный путь к ней.В lib / могут быть дополнительные каталоги, которые не имеют значения.

1 голос
/ 10 мая 2019

Возможно, я неправильно понимаю вашу проблему, но local::lib позволяет вам "вручную" настроить путь к вашему модулю. Вы должны иметь возможность использовать его для контроля путей, используемых в вашей тестовой среде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...