2013-03-21 4 views
1

Я работаю над проектом, который требует установки всех perl-модулей сторонних производителей (чтение: CPAN) в репозитории perforce, так что любой код, который зависит от них, может быть успешно запускаются без необходимости установки вручную вручную. Я использую cpanminus для установки модулей CPAN, поэтому я запустил cpanm -L . Moose в нужном каталоге и все было успешно установлено. Однако, когда я пытаюсь скомпилировать модуль, который я сделал с лосем, иногда я получаю эту ошибку:Использовать локально установленный модуль для использования локально установленных зависимостей

Undefined subroutine &Carp::longmess_heavy called at /usr/lib/perl5/5.8.8/Carp.pm line 235. 

Она выглядит, хоть карп был установлена ​​в мой локальный каталог с лосем, она, используя (устаревшее) версия в /user/lib/perl5/5.8.8. Я мог бы модернизировать Carp на своей машине, но как только я проверю свой код в репозитории, все остальные с их устаревшими карпами столкнутся с той же проблемой. Итак, как заставить Моуз использовать локально установленный Карп, а не тот, который находится в /usr/lib/perl5/5.8.8?

ответ

0

Мне удалось найти решение. Это грязно, но это цена, которую я должен заплатить за присоединение к проекту, у которого уже есть грязная система.

До включения Лося, я явно требовал нового Карпа:

require "[path to Carp]/Carp.pm"; 

Это вызвало много предупреждений о переопределении подпрограммы, так что я должен был (временно) подавить их:

my $restore_warn = $SIG{'__WARN__'}; 
$SIG{'__WARN__'} = sub {}; 
require "[path to Carp]/Carp.pm"; 
$SIG{'__WARN__'} = $restore_warn; 
5

Вы не заставляете Муха, вы вынуждаете perl. Вы установили модуль в место, где perl ничего не знает, поэтому вам нужно сообщить об этом perl.

Поскольку вы хотите повлиять на все сценарии, вы хотите разместить их в своем сценарии входа.

export PERL5LIB=/home/.../lib 

Если вы хотите влияют только на эту одну программу, вы запустите программу, используя следующее:

PERL5LIB=/home/.../lib script 

или вы добавить следующее в ваш скрипт:

use lib '/home/.../lib'; 
+0

Это правильно, но не очень переносимо. Я бы рекомендовал использовать local :: lib. http://search.cpan.org/dist/local-lib/lib/local/lib.pm#The_bootstrapping_technique –

+1

@misplacedme, 1) local :: lib просто неспособен. (На самом деле это чрезвычайно сложно использовать в скрипте входа.) 2) local :: lib использует INSTALL_BASE, который, как я считаю, ошибочен дизайном. – ikegami

+0

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

Смежные вопросы