Если в целях переносимости хранить перловые модули рядом со своим кодом - будет не очень хорошо. Если при этом ещё и своих собственных модулей наберётся не один десяток (я такой винегрет встречал) - совсем плохо. Вывод - надо разделять.
Один из вариантов - использовать
carton. Для тех, кому лень читать по-английски, есть перевод - статья Вячеслава Тихановского «
Локальная установка и использование Perl-модулей» из журнала Pragmatic Perl за 2014 год.
Carton берёт список модулей, ставит их локально (root не нужен) вместе с зависимостями и позволяет запускать приложения с таким вот набором модулей. Список используемых модулей (если carton ещё ничего не ставил) можно достать из скриптов и своих модулей:
find . -type f -name \*p\[lm\] -exec egrep -n '^use ' '' ';' \
| cut -d' ' -f 2 | sort -u
Чтоб указать необходимость установки какого-нибудь Module::Name, достаточно добавить в файл cpanfile строку
requires 'Module::Name';
Carton умеет ставить нужные версии модулей, однако в документации этот момент вскользь упомянут, но не описан должным образом. Если захотеть, например, поставить старую версию модуля
Sphinx::Search (это потребуется, если сам Сфинкс не новый) и написать
requires 'Sphinx::Search', '0.28';
то вместо желаемой версии будет установлена свежая (0.31 по состоянию на март 2018) - похоже, такая запись указывает минимально допустимую версию. Если поменять код на
requires 'Sphinx::Search', '== 0.28';
и снова выполнить carton install, версия поменяется
Installing modules using /home/.../cpanfile
Successfully installed Sphinx-Search-0.28 (downgraded from 0.31)
1 distribution installed
Команда carton exec может пригодиться для запуска не только самого́ приложения, но и чего-нибудь ещё:
carton exec prove -l
http://shoorick.ru/2018/03/10/carton/