Какой самый простой способ установить отсутствующий модуль Perl?

192

Я получаю эту ошибку:

Can't locate Foo.pm in @INC

Есть ли более простой способ его установки, чем загрузка, распаковка, создание и т. Д.?

дайвов
источник
1
Если рассматриваемый модуль является основным модулем, обратитесь к разделу Как исправить «Не удается найти архив / Tar.pm» .
Ikegami
Будьте очень осторожны в отношении безопасности: то, что необходимо для гарантии того, что модули не были изменены, должно быть безопасно загружено с доверенного сайта. Смотрите мой ответ по поводу использования cpan.
vinc17

Ответы:

226

В Unix :

обычно вы запускаете cpan в вашей оболочке:

# cpan

и введите

install Chocolate::Belgian

или в краткой форме:

cpan Chocolate::Belgian

В Windows :

Если вы используете ActivePerl в Windows, PPM (Perl Package Manager) обладает практически теми же функциями, что и CPAN.pm.

Пример:

# ppm
ppm> search net-smtp
ppm> install Net-SMTP-Multipart

смотрите Как установить модули Perl? в FAQ по CPAN

Многие дистрибутивы поставляют множество Perl-модулей в виде пакетов.

  • Debian / Ubuntu: apt-cache search 'perl$'
  • Arch Linux: pacman -Ss '^perl-'
  • Gentoo: категория dev-perl

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

Для Gentoo есть хороший инструмент под названием g-cpan, который собирает / устанавливает модуль из CPAN и создает для вас пакет Gentoo ( ebuild ).

Бенедикт Вальдвогель
источник
14
Краткая форма - это просто «cpan Chocolate :: Belgian» из командной строки :)
Брайан Д. Фой
3
IIRC последней версии ActivePerl больше не имеет ppm командной строки, теперь он открывает модный графический интерфейс.
Кев
6
Просто «ppm» открывает графический интерфейс, но после команд он остается в командной строке. Итак, «ppm help», «ppm install ...» и т. Д.
Билл Рупперт
Обратите внимание, что ppm использует тире для разделителя пути модуля, а не обычные двойные двоеточия. (? Возможно , потому , что колоны значат диски в DOS) То есть я несколько раз;)
Матфея Заблокируйте
3
@MatthewLock: ppmиспользует дефисы, -потому что вы указываете дистрибутив , который хотите установить, что намного честнее. Например, если вы используете cpanдля установки LWP, LWP::Simpleили LWP::UserAgentон установит дистрибутив libwww-perlдля вас. Большинство дистрибутивов содержат один модуль с эквивалентным именем, но есть несколько подобных исключений
Бородин
65

Попробуйте приложение :: cpanminus :

# cpanm Chocolate::Belgian

Это здорово, просто чтобы установить вещи. Он не предоставляет ни одной из более сложных функций CPAN или CPANPLUS, поэтому его легко использовать, если вы знаете, какой модуль вы хотите установить. Если вы еще не получили cpanminus, просто наберите:

# cpan App::cpanminus

установить его.

Также возможно установить его вообще без использования cpan. Основная процедура начальной загрузки:

curl -L http://cpanmin.us | perl - --sudo App::cpanminus

Для получения дополнительной информации перейдите на страницу App :: cpanminus и посмотрите раздел по установке.

Philip Potter
источник
7
Использование cpanдля установки App::cpanminusнемного странно. Обычные инструкции по установке включают в себя процедуру начальной загрузки, когда часть ее загружается из cpanmin.us и используется для установки остальных. Это позволяет избежать настройки cpanи создания (после этого) бесполезного .cpanкаталога.
час. Оуэнс
На Ubuntu вы можете просто установить cpanminusс терминала. Я считаю, что cpanmлучше, cpanпотому что он не выводит журналы ошибок на экран, а сохраняет их во временных файлах журналов и дает путь в случае ошибок.
user13107
Я получаю эту ошибку при попытке выполнить
IgorGanapolsky
29

Я заметил, что некоторые люди предлагают один запуск cpan под sudo. Раньше это было необходимо для установки в системный каталог, но современные версии оболочки CPAN позволяют настроить его для использования только sudo для установки. Это намного безопаснее, поскольку это означает, что тесты не запускаются от имени пользователя root.

Если у вас есть старая оболочка CPAN, просто установите новый cpan («установить CPAN»), и когда вы перезагрузите оболочку, она предложит вам настроить эти новые директивы.

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

Кроме того, я настоятельно рекомендую пользователям Windows исследовать клубничный Perl . Это версия Perl, которая поставляется с предварительно настроенной оболочкой CPAN, а также с компилятором. Он также включает в себя некоторые трудно компилируемые модули Perl с их внешними зависимостями библиотеки C, в частности, XML :: Parser. Это означает, что вы можете делать то же самое, что и любой другой пользователь Perl, когда дело доходит до установки модулей, и вещи, как правило, «просто работают» гораздо чаще.

Дэйв Рольски
источник
1
install CPANотсюда? $sudo apt-get install cpan?
изоморфизм
1
@Lao Tzu: нет, поскольку CPAN является основным модулем Perl и не доступен в виде отдельного пакета DEB. Я думаю, что в большинстве случаев это даже лучше использовать App::cpanminus, это такая радость, чтобы использовать его. Филипп Поттер предлагает это в своем ответе здесь, и вы можете попробовать этот час. Ответ Оуэнса .
WK
25

Если вы работаете в Ubuntu и хотите установить предварительно упакованный модуль perl (например, geo :: ipfree), попробуйте следующее:

    $ apt-cache search perl geo :: ipfree
    libgeo-ipfree-perl - страна поиска модуля Perl с IP-адресом

    $ sudo apt-get install libgeo-ipfree-perl
эфирное масло
источник
Это круто. Спасибо.
Иван Х
16

Несколько человек упомянули утилиту cpan, но это больше, чем просто запуск оболочки. Просто дайте ему модули, которые вы хотите установить, и дайте ему работать.

$prompt> cpan Foo::Bar

Если вы не дадите ему никаких аргументов, он запустит оболочку CPAN.pm. Это работает на Unix, Mac и должно быть хорошо на Windows (особенно Strawberry Perl).

Есть несколько других вещей, которые вы можете сделать с помощью инструмента cpan. Вот краткое описание текущих функций (которые могут быть новее, чем те, которые поставляются с CPAN.pm и perl):

-a
Creates the CPAN.pm autobundle with CPAN::Shell->autobundle.

-A module [ module ... ]
Shows the primary maintainers for the specified modules

-C module [ module ... ]
Show the Changes files for the specified modules

-D module [ module ... ]
Show the module details. This prints one line for each out-of-date module (meaning,
modules locally installed but have newer versions on CPAN). Each line has three columns:
module name, local version, and CPAN version.

-L author [ author ... ]
List the modules by the specified authors.

-h
Prints a help message.

-O
Show the out-of-date modules.

-r
Recompiles dynamically loaded modules with CPAN::Shell->recompile.

-v
Print the script version and CPAN.pm version.
Брайан Д. Фой
источник
11

sudo perl -MCPAN -e 'install Foo'

dreeves
источник
Замечательно, у меня это работало только сейчас на Windows с Git Perl, но мне пришлось сначала установить GnuWin make
wytten
8

Отто сделал хорошее предложение . Это работает и для Debian, как и для любой другой производной Debian. Недостающая часть - что делать, когда поиск в apt-cache не находит ничего.

$ sudo apt-get install dh-make-perl build-essential apt-file
$ sudo apt-file update

Тогда всякий раз, когда у вас есть случайный модуль, вы хотите установить:

$ cd ~/some/path
$ dh-make-perl --build --cpan Some::Random::Module
$ sudo dpkg -i libsome-random-module-perl-0.01-1_i386.deb

Это даст вам пакет deb, который вы можете установить, чтобы получить Some :: Random :: Module. Одним из больших преимуществ здесь являются страницы руководства и примеры сценариев в дополнение к самому модулю, который будет размещен в выбранном вами дистрибутиве. Если дистрибутив выпускает официальный пакет для более новой версии Some :: Random :: Module, он будет автоматически установлен при обновлении apt-get.

mikegrb
источник
7

Уже ответил и принял ответ - но все равно:

ИМХО самый простой способ установки модулей CPAN (в системах, подобных unix, и не имеющих представления о вдовах):

curl -L http://cpanmin.us | perl - --sudo App::cpanminus

Выше описана установка "установщика CPAN-модулей нулевой конфигурации" cpanm. (Установка может занять несколько минут - не прерывайте процесс)

а после - просто:

cpanm Foo
cpanm Module::One
cpanm Another::Module
jm666
источник
6

Много рекомендаций для CPAN.pm, и это здорово, но если вы используете, Perl 5.10то у вас также есть доступ к CPANPLUS.pmчему-то вроде, CPAN.pmно лучше.

И, конечно, он доступен CPANдля людей, все еще использующих более старые версии Perl. Почему бы не попробовать:

$ cpan CPANPLUS
Дейв Кросс
источник
Хех, это мило. Используйте CPAN.pm, чтобы заменить себя CPANPLUS. :)
Брайан Д. Фой
5

Часто случается, что команда cpan install завершается неудачно с сообщением типа «make test вернул плохой статус, не установит без силы»

В этом случае следующий способ установки модуля:

perl -MCPAN -e "CPAN::Shell->force(qw(install Foo::Bar));"
jaxbihani
источник
К сожалению, это приводит к следующему: Не удается найти CPAN.pm в @INC (может потребоваться установить модуль CPAN) (@INC содержит: / etc / perl
IgorGanapolsky
4

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

Foo::BarНапример, чтобы установить в командной строке, просто выполните:

sudo apt-get install libfoo-bar-perl

К сожалению, не все модули следуют этому соглашению об именах.

Myforwik
источник
4

Даже это должно работать:

cpan -i module_name
серенесат
источник
4

Используйте команду cpan как cpan Modulename

$ cpan HTML::Parser

Для установки зависимостей автоматически следуйте приведенным ниже инструкциям.

$ perl -MCPAN -e shell
cpan[1]>  o conf prerequisites_policy follow
cpan[2]>  o conf commit
exit

Я предпочитаю App :: cpanminus , он устанавливает зависимости автоматически. Просто сделать

$ cpanm HTML::Parser
Chankey Pathak
источник
3

2 способа, которые я знаю:

ИСПОЛЬЗОВАНИЕ PPM:

С Windows (ActivePerl) я использовал ppm

из командной строки введите ppm. По приглашению ppm ...

ppm> install foo

или

ppm> search foo

чтобы получить список доступных модулей foo. Введите help для всех команд

ИСПОЛЬЗУЯ CPAN:

Вы также можете использовать CPAN следующим образом ( * nix системы ):

perl -MCPAN -e 'shell'

получает вам подсказку

cpan>

по быстрому ...

cpan> install foo  (again to install the foo module)

введите h, чтобы получить список команд для cpan

JWHEAT
источник
1
Вы также можете просто сказать «$ cpan Foo :: Bar» для установки прямо из командной строки. Не нужно модного однострочного или CPAN-оболочки. :)
Брайан Д. Фой
3

На Fedora вы можете использовать

# yum install foo

до тех пор, пока Fedora имеет существующий пакет для модуля.

Брюс Олдерман
источник
3

На Fedora Linuxили Enterprise Linux, yumтакже треки библиотека Perl зависимостей. Таким образом, если модуль perl доступен, и какой-то пакет rpm экспортирует эту зависимость, он установит нужный вам пакет.

yum install 'perl(Chocolate::Belgian)'

(скорее всего, Perl-шоколадно-бельгийский пакет или даже пакет ChocolateFactory)

Michal Ingeli
источник
3

Самый простой способ для меня это:

PERL_MM_USE_DEFAULT=1 perl -MCPAN -e 'install DateTime::TimeZone'

а) автоматическое рекурсивное обнаружение / разрешение / установка зависимостей

б) это оболочка, хорошая для скриптов установки

Мистер Икс
источник
2

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

 #wget <URL to the module.tgz>
 ##unpack
 perl Build.PL
./Build destdir=$HOME install_base=$HOME
./Build destdir=$HOME install_base=$HOME install
venkrao
источник
2

Иногда вы можете использовать yum search fooдля поиска относительного модуля Perl, а затем использовать yum install xxxдля установки.

Chris Forever
источник
2

Безопасное решение

Во многих ответах упоминается использование cpanутилиты (которая использует CPAN.pm) без слов о безопасности. По умолчанию CPAN2.27 и более ранние urllistверсии настраивают использование URL-адреса http (а именно, http://www.cpan.org/ ), который разрешает атаки MITM, поэтому небезопасен. Это то, что используется для загрузки CHECKSUMSфайлов, поэтому его необходимо заменить на безопасный URL-адрес (например, https://www.cpan.org/ ).

Таким образом, после запуска cpan и принятия конфигурации по умолчанию, вам нужно изменить сгенерированный MyConfig.pmфайл (выводится полный путь) следующим образом. замещать

'urllist' => [q[http://www.cpan.org/]],

по

'urllist' => [q[https://www.cpan.org/]],

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

Тогда вы можете использовать cpan обычным способом.

Мой отчет об ошибке на rt.cpan.org о небезопасном URL.

vinc17
источник
Разве « cpan.org » не перенаправляется на « cpan.org »?
Дейв Эверитт
1
@DaveEveritt Перенаправление с http на https полезно только для обеспечения конфиденциальности, например, для тех, кто может просматривать только данные, передаваемые по сети. Но если злоумышленник контролирует сеть (например, публичную точку доступа Wi-Fi или некоторую незащищенную локальную сеть), атака «человек посередине» может быть возможной, и злоумышленник будет использовать свой собственный сервер (очевидно, нет https://www.cpan.org/).
vinc17
1

В Windows с дистрибутивом Perl ActiveState используйте команду ppm .

Военнопленный
источник
1

Простое выполнение cpan Foo::Barв оболочке будет служить цели.

Камаль Наян
источник
1

Похоже, вы уже получили свой ответ, но я решил, что я буду вмешиваться. Это то, что я делаю в некоторых скриптах на Ubuntu (или сервере Debian)

#!/usr/bin/perl

use warnings;
use strict;

#I've gotten into the habit of setting this on all my scripts, prevents weird path issues if the script is not being run by root
$ENV{'PATH'} = '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin';

#Fill this with the perl modules required for your project
my @perl = qw(LWP::Simple XML::LibXML MIME::Lite DBI DateTime Config::Tiny Proc::ProcessTable);

chomp(my $curl = `which curl`);

if(!$curl){ system('apt-get install curl -y > /dev/null'); }

chomp(my $cpanm = system('/bin/bash', '-c', 'which cpanm &>/dev/null'));

#installs cpanm if missing
if($cpanm){ system('curl -s -L http://cpanmin.us | perl - --sudo App::cpanminus'); }

#loops through required modules and installs them if missing
foreach my $x (@perl){
    eval "use $x";
    if($@){
        system("cpanm $x");
        eval "use $x";
    }
}

Это хорошо работает для меня, может быть, здесь есть что-то, что вы можете использовать.

Эд Данн
источник