Как я могу установить модули CPAN локально без рут-доступа (ошибка строки 229 DynaLoader.pm)? - PullRequest
8 голосов
/ 19 сентября 2008

Не работает с другими модулями, но для примера. Я установил Text :: CSV_XS с настройкой CPAN:

'makepl_arg' => q[PREFIX=~/lib],

Когда я пытаюсь запустить скрипт test.pl:

$ perl test.pl

#!/usr/bin/perl

use lib "/homes/foobar/lib/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi";

use Text::CSV_XS;

print "test";

Я получаю

Can't load '/homes/foobar/lib/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi/auto/Text/CSV_XS/CSV_XS.so' for module Text::CSV_XS: /homes/foobar/lib/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi/auto/Text/CSV_XS/CSV_XS.so: cannot open shared object file: No such file or directory at /www/common/perl/lib/5.8.2/i686-linux/DynaLoader.pm line 229.
at test.pl line 6
Compilation failed in require at test.pl line 6.
BEGIN failed--compilation aborted at test.pl line 6.

Я проследил ошибку до DynaLoader.pm, это происходит в этой строке:

# Many dynamic extension loading problems will appear to come from
# this section of code: XYZ failed at line 123 of DynaLoader.pm.
# Often these errors are actually occurring in the initialisation
# C code of the extension XS file. Perl reports the error as being
# in this perl code simply because this was the last perl code
# it executed.

my $libref = dl_load_file($file, $module->dl_load_flags) or
    croak("Can't load '$file' for module $module: ".dl_error());

CSV_XS.so существует в указанном выше каталоге

Ответы [ 6 ]

5 голосов
/ 19 сентября 2008

Когда вы установили модуль, вы смотрели вывод? Где он сказал, что установил модуль? Посмотрите в lib . Вы видите следующий каталог, который ожидаете?

Загляните в ~ / lib, чтобы узнать, где все закончилось, чтобы убедиться, что в вашем выражении use lib указано правильное имя каталога:

% find ~/lib -name CSV_XS.so

Как только вы увидите, где оно установлено, используйте это имя каталога в вашем use lib (или PERL5LIB или что-то еще).

Я ожидаю, что у вас там как-то есть lib/lib. PREFIX - это просто префикс, и установщик добавляет другие части каталога к этому базовому пути. Это включает в себя lib, man, bin, и т.д .

4 голосов
/ 23 января 2009

Лично я бы предложил использовать local :: lib . :)

2 голосов
/ 19 сентября 2008

Попробуйте вместо этого:

'makepl_arg' => q[PREFIX=~/]

PREFIX устанавливает базу для всех каталогов, в которые вы будете устанавливать (bin, lib и т. Д.)

Вы также можете столкнуться с проблемами расширения оболочки с вашим '~'. Вы можете попробовать расширить его самостоятельно:

'makepl_arg' => q[PREFIX=/home/users/foobar]

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

1 голос
/ 08 ноября 2008

Из сообщения об ошибке ("at / www / common ...") видно, что ваш скрипт является скриптом CGI или mod_perl. Скорее всего, веб-сервер не работает как пользователь 'foo', в чей домашний каталог вы установили модуль - это может привести к тому, что веб-сервер не сможет прочитать этот каталог.

Возможно, он также работает в " chroot jail ", что означает, что каталог, в который вы установили модуль, может быть не виден сценарию.

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

0 голосов
/ 20 сентября 2008

Я настоятельно рекомендую установить свой собственный perl в свой домашний каталог, если у вас есть место. Тогда вы можете держать все под своим контролем и сохранять свой собственный модуль установленным, а также экранировать, если администраторы держат вас на более старой версии Perl. (Не говоря уже о том, чтобы сохранить себя, если они когда-нибудь обновятся и пропустят все модули, на которые вы полагаетесь.)

0 голосов
/ 19 сентября 2008

Существует ли данный файл (CSV_XS.so)?

Существует ли в указанном месте?

Если вы делаете:

set |grep PERL

Какой вывод?

Вы успешно установили другие локальные модули Perl?

...