Как я могу заставить Perl запускать модуль только из тестового каталога?

У меня есть файл модуля perl и тестовый скрипт pl, который я использую для запуска некоторой функции, и после просмотра библиотеки использования и этот предыдущий вопрос здесь... Я до сих пор не знаю, как это сделать.

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

no lib qw(prod_dir);

и при печати @INC показывает, что каталога больше нет, скрипт почему-то все еще вызывает этот другой модуль...

Я знаю, что это, вероятно, звучит очень глупо, но надеюсь, что кто-то может помочь мне увидеть здесь свет :) спасибо.


person melaos    schedule 01.10.2009    source источник
comment
BEGIN{@INC='test'} может сработать.   -  person Brad Gilbert    schedule 01.10.2009


Ответы (2)


После того, как у вас есть required или used модуль, проверьте %INC, чтобы узнать, откуда он взялся.

Например:

use Data::Dumper;
print $INC{'Data/Dumper.pm'}."\n";

Обратите внимание, что "::" становится "/", и вы добавляете ".pm". Это может дать вам подсказку.

Помните, что текущий каталог ("".") обычно является записью в @INC. Но первый шаг — выяснить, из какого каталога был загружен модуль.

Еще одна вещь, которую следует помнить, это то, что каталоги в @INC просматриваются по порядку. use lib добавляется к этому списку (что делает его первым искомым каталогом), поэтому вам может просто понадобиться добавить соответствующий каталог.

person cjm    schedule 01.10.2009

Можете ли вы рассказать больше о том, что вы пытаетесь сделать и как вы пытаетесь это сделать? Входит ли этот материал в стандартную структуру дистрибутива Perl? Если вы не используете стандартную структуру распространения, можете ли вы показать нам список каталогов, чтобы мы знали, где что находится? Можете ли вы также включить код, который вы используете, чтобы попытаться загрузить модуль? Просто обновите исходный вопрос, когда соберете детали.

Обычно я запускаю тесты через средство запуска сборки, которое автоматически устанавливает правильный @INC.

Если я хочу запустить один тест в своем дистрибутиве, я использую модуль blib, чтобы найти библиотеку сборки, в которой есть разрабатываемые версии моих модулей:

 % perl -Mblib t/test.t

Некоторые люди делают то же самое с доказать.

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

Если у вас просто есть модуль и тестовый файл в одном каталоге, пробовали ли вы добавить текущий каталог в @INC с помощью PERL5LIB?

person brian d foy    schedule 01.10.2009
comment
@Brian - Да, это mod perl, и у нас есть каталог, в котором мы обычно храним остальные дополнительные файлы pm, которые мы используем. Я думаю, что здесь может быть какая-то циклическая зависимость или что-то еще, что вызывает эту проблему :( - person melaos; 06.10.2009