Как я могу установить версию Perl у себя дома с помощью perlbrew?

Я установил perlbrew, что кажется хорошим решением, но я получаю какая-то бессмысленная ошибка при попытке установить какую-то версию Perl:

$ perlbrew install perl-5.12.1
Attempting to load conf from /home/dave/perl5/perlbrew/Conf.pm
Fail to get http://search.cpan.org/dist/perl-5.12.1 (error: ) at /home/dave/perl5/perlbrew/bin/perlbrew line 1277.

person David B    schedule 15.09.2010    source источник
comment
Вы получаете эту ошибку, когда не удается найти/загрузить исходный код Perl. Так могут быть проблемы с интернетом или брандмауэром?   -  person draegtun    schedule 15.09.2010
comment
убунту 10.04. У меня включен прокси. wget работает, также git и cpan (вот как я его впервые установил).   -  person David B    schedule 15.09.2010
comment
Кстати, недавно был выпущен perl 5.12.2: news.perlfoundation.org/ 2010/09/perl-5122-released.html   -  person draegtun    schedule 17.09.2010
comment
@draegtun, кстати, есть ли способ запросить у perlbrew список версий Perl, доступных для установки?   -  person David B    schedule 17.09.2010
comment
Я не думаю, что perlbrew имеет эту опцию, потому что он просто рабски вытаскивает запрошенный вами Perl, например, для perlbrew install perl-5.12.3 (он будет пытаться выдавать ошибку, пока однажды 5.12.3 действительно не появится!). Так что да, это была бы очень хорошая функция для perlbrew. Тем временем я быстро собрал этот скрипт, чтобы получить список доступных версий Perl: gist.github.com/584025   -  person draegtun    schedule 17.09.2010


Ответы (1)


Основываясь на ваших комментариях, установлена ​​ли в вашей оболочке переменная http_proxy ENV?

$ env | grep http_proxy

Если нет, установите его с помощью настроек прокси-сервера и повторите попытку установки perlbrew:

 $ export http_proxy = "http://yourProxyURLorIP:8080"
 $ perlbrew install perl-5.12.1

perlbrew использует эту переменную ENV для выбора прокси-сервера. Если эта переменная ENV не установлена, она пытается установить обычное прямое HTTP-соединение (см. ">строка 1274 в текущем мастере perlbrew на Github)

$ua->proxy($ENV{http_proxy}) if $ENV{http_proxy};

Если это не сработает, посмотрите HTTP::Lite. Это то, что perlbrew использует для извлечения исходного кода. Примечание. perlbrew использует собственную копию HTTP::Lite

Наконец, если вам все еще не повезло, вы упомянули, что «сначала установили его» через CPAN. В документах упоминаются проблемы при обновлении с предыдущей версии CPAN. Это может быть что-то еще, что вам нужно изучить?


Обновить Протестируйте этот скрипт HTTP::Lite и дайте мне известно, что вы видите (примечание. Возможно, вам потребуется установить HTTP::Lite):

use strict;
use warnings;
use HTTP::Lite;

my $ua = HTTP::Lite->new;

$ua->proxy("yourProxyURLorIP:8080");  # <= http_proxy env minus "http://"

my $req = $ua->request( 'http://search.cpan.org/dist/perl-5.12.1/' ) 
    or die "Unable to get document: $!";


print $ua->body();   # <= if you get this then all is good!

Я думаю, вы, вероятно, столкнулись с известной ошибкой в ​​HTTP::Lite, см. RT проблема переменные окружения прокси-сервера в стиле uri не могут правильно установить прокси и порт.

Приведенный выше код является обходным путем для этой ошибки. Я предполагаю, что та же ошибка находится в perlbrew копии HTTP::Lite. Если это так, то удаление http:// из вашего http_proxy ENV решит проблему (знаменитые последние слова!)


Обновление 2

Просто чтобы прояснить мой последний комментарий, когда вы запускаете perlbrew, вы можете сделать это (из оболочки, такой как bash):

http_proxy=IPaddr:Port perlbrew install perl-5.12.1

Вам нужно будет всегда добавлять префикс к каждой команде perlbrew, по крайней мере, до тех пор, пока не будет исправлена ​​ошибка прокси-сервера HTTP::Lite или perlbrew.

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

$ENV{http_proxy} = "IPaddr:Port";   # <= your proxy IP & port

Надеюсь, мы наконец взломали его! Дайте мне знать, если все будет успешно, потому что если да, то я отправлю исправление в Gugod (автор perlbrew) с необходимые локальные изменения в HTTP::Lite.

person draegtun    schedule 15.09.2010
comment
Какую версию perlbrew вы используете? Эта строка, о которой я упоминал выше, не всегда была там :( Вы можете проверить, выполнив grep http_proxy ~/perl5/perlbrew/bin/perlbrew. Последняя версия perlbrew - 0.10. - person draegtun; 16.09.2010
comment
Только что проверил историю коммитов на Github, и строка ENV http_proxy была добавлена ​​только в версии 0.9 3 августа. Так что обновление до последней версии должно решить ваши проблемы (постучите по дереву!) - person draegtun; 16.09.2010
comment
Я думаю, что использую последнюю версию, только что скачал ее пару дней назад. grep http_proxy ~/perl5/perlbrew/bin/perlbrew дает $ua->proxy($ENV{http_proxy}) if $ENV{http_proxy}; - person David B; 16.09.2010
comment
Скрестим пальцы, это http:// ошибка в прокси-коде HTTP::Lite! Смотрите мое обновление. - person draegtun; 16.09.2010
comment
+1 draegtun, я следовал твоим инструкциям, и, похоже, это сработало. Так должен ли я как-то изменить свой прокси-сервер env? Когда я использую Ubuntu Preferences-›Network Proxy, прокси записывается без каких-либо http:// (но когда я echo $http_proxy, это с http://. Итак, что мне делать - и может ли это (что я должен сделать...) повлиять на другие вещи ? - person David B; 16.09.2010
comment
@David B: Да, я не уверен в побочных эффектах изменения http_proxy env для других вещей. Однако вы можете безопасно делать следующее каждый раз без побочных эффектов: http_proxy=IPaddress:Port perlbrew .... Это только устанавливает переменную env для команды, которая следует за ней. Так можно ли использовать это, пока HTTP::Lite / perlbrew не будет исправлено? Или же добавьте $ENV{http_proxy}="IPaddr:Port" к вашему perlbrew скрипту локально. - person draegtun; 16.09.2010