Не могу не написать продолжение истории про перл. Так как бот для jabber-а из предыдущей статьи написан именно на нём.
Итак, чтобы не морочить себе голову со сборкой зависимостей, я решил их не мудрствуя лукаво... завендорить, то есть создать каталог с перловыми модулями прямо в директории с приложением и ссылаться в своём приложении непосредственно на него.
Существуют некоторые утилиты и подходы для облегчения поддержки такого подхода. Это cpanfile, в котором мы прописываем название модулей и минимальную их версию, необходимую для работы приложения и это утилиты, позволяющие автоматизировать процесс добычи зависимостей из интернетов. Из популярных (в узких кругах любителей перла) утилит, известных мне - это cpanminus или для краткости cpanm, carton, cpm, ну и, собственно, для полноты картины, сам cpan.
Для стройности повествования, следует отметить, что для использования кастомных путей для установки библиотек, нам пригодится модуль local::lib. Не следует забывать про этот модуль.
Думаю, для полноты обзора, имеет смысл пробежаться по всем утилитам, чтобы понимать что в каких случаях имеет смысл взять.
CPAN - старая-добрая каноничная утилита, подозреваю, что она возникла первой из всего списка подобных утилит. Эта утилита не поддерживает cpanfile, но зато умеет добывать зависимости для указанного модуля помимо самого модуля, конечно. Умеет работать с local::lib. Утилита, конечно, удобная, но учитывая отсутствие поддержки cpanfile она может пригодиться разве что на windows, где дистрибуция perl немного своеобразная. Я имею в виду Strawberry Perl. Насколько я помню, у Active Perl своя утилита для установки модулей - ppm. Cpan поставляется с perl-ом, однако в некоторых дистрибутивах linux/*nix он может быть запакетирован отдельно, но тем не менее - это часть perl-а.
CPANM - более современный вариант утилиты cpan, по-умолчанию, она пред(по)лагает использование с local::lib и если этого модуля нет, то ставит модули либо в ~/perl5, либо в систему (если запущена от root-а), при этом выводит довольно объёмное и подробное предупреждение. Cpanm поддерживает основной синтаксис cpanfile v1.0, в том числе возможность устанавливать модули определённой версии или из определённого диапазона версий. Для работы cpanm не нужно никаких дополнительных зависимостей, достаточно основного дистрибутива самого perl. Хотя в некоторых дистрибутивах linux/*nix core-модули могут быть запакетированны отдельно. Однако, крайне желательно всё-таки, чтобы был проставлен сторонний модуль local::lib, чтобы иметь возможность не складывать всё к пользователю в ~/perl5.
CARTON - расширенный менеджер модулей. Для его работы необходимо некоторое количество сторонних модулей, мало того, не во всех дистрибутивах linux/*nix имеется как этот менеджер модулей, так и зависимости к нему.
Интересной особенностью является возможность точно указать не только нужные версии модулей для приложения, но и записать и воспроизвести в другом окружении точные номера версий, используемые к конкретном окружении. Эта возможность является принципиальным отличием от cpanm, где указывается только минимальная версия. Для реализации подобной роскоши, в дополнении к cpanfile используется cpanfile.snapshot.
Кроме того, carton позволяет указать, откуда будет взят файл, прямо url-ом, для этого используется расширенный синтаксис в cpanfile. Это позволяет воспользоваться приватными репозиториям со своими модулями или модифицированными версиями публично доступных официальных модулей.
Все модули по-умолчанию складываются в каталог ./local в директории приложения.
CPM - ещё более продвинутый менеджер модулей для перловых приложений.
Требует ещё бОльшего количества сторонних модулей для своей работы.
Наверно, основной отличительной чертой этого модуля в сравнении с carton является многопоточная работа. Эта основная черта является основной причиной багов этого модуля так как граф зависимостей строится отдельно для каждого потока. Но, в общем и целом, со своей задачей cpm справляется хорошо.
Итак, переходим к следующему моменту, а именно к тому, как в приложении сослаться на каталог с модулями. В моём случае это vendor_perl. В основном файле своего приложения достаточно прописать:
use lib qw(./vendor_perl/lib/perl5);
где в массиве после use lib мы перечисляем пути до модулей, используемых нашим приложением.
Собственно, для своих нужд мне достаточно cpanm, так с ним наименьшее количество мороки и наибольший профит. В моём случае этого пока достаточно.
Однако, не следует забывать, что модули для perl-а частенько содержат в себе ошибки, либо недостаточно гибки в конфигурации, либо ещё какие-то особенности, от которых хочется избавиться, поэтому в каждом конкретном случае необходим собственный подход. Cpanminus может не хватить хотябы потому, что в нём нет поддержки darkpan, то есть своих, кастомных модулей. Впрочем, этот момент в случае, если дело не касается XS-ки можно обойти. И даже XS-ку тоже можно свою скормить cpanm, но для этого придётся несколько заморочится со скриптом подготовки рабочего окружения.