POWERMAN
"In each of us sleeps a genius...
and his sleep gets deeper everyday."

Abstract

В процессе работы накапливается куча perl модулей, часть установлена ручками, часть через emerge, часть вообще устанавливалась под предыдущими версиями perl… В результате начинаются конфликты при установке сложных модулей типа Compress::Zlib да и вообще не поймёшь какая версия используется и как её обновить если нужно (в частности это касается DBI, который обычно ставится и ручками и через emerge).

Список нужных модулей

Чтобы удалить ненужные модули нужно знать какие нужные. :) Для выяснения этого вопроса я по своим серверам прогнал одну зверскую командочку по всем каталогам где водятся perl-скрипты:

rgrep --no-filename '\buse\s+[a-zA-Z0-9:_-]+\b' -size -100k |
    perl -nle 'print for /\buse\s+([a-zA-Z0-9:_-]+)\b/' |
    sort -u |
    perl -ne 'eval "use $_;"; $@ ? warn($_) : print($_)' >needed_modules

Катарсис

Подготовить perl к "экстренной установке" :-)
emerge -aB perl
Удалить все Gentoo-шные perl-модули (/usr/lib/perl5/vendor_perl/) и сам perl
emerge -C $(qlist -C -I -v dev-perl/ | sed s,^,=,)
emerge -C perl
Почистить мусор
rm -rf /usr/lib/perl5/
rm -rf ~/.cpan* /var/tmp/.cpan*
Быстро ставим perl обратно, пока ещё можно :)
emerge -K perl
Доустанавливаем действительно необходимые Gentoo perl-модули
emerge -uDNa world
Note

Естественно, для последнего пункта неплохо чтобы у вас система была уже обновлена и world не потянул за собой ещё сотню пакетов кроме dev-perl/*.

У меня emerge поставил:

dev-perl/DBD-mysql-3.0008
dev-perl/DBI-1.53
dev-perl/DateManip-5.44
dev-perl/Net-Daemon-0.39
dev-perl/PlRPC-0.2018

Из них мне действительно нужны DBI и DBD::mysql, но не тех версий, которые поставил emerge, так что на следующем этапе эту проблему нужно будет решить.

Upgrade

Обновляем cpan - не ручками же модули ставить… :) В процессе он попросит себя настроить, кроме того он там попутает зависимости Compress::Zlib, из-за чего команду install Bundle::CPAN придётся перезапускать несколько раз.

cpan
> install Bundle::CPAN  # поставит всё кроме Compress::Zlib и Archive::Zip
Ctrl-D
cpan
> o conf commit
> install Bundle::CPAN  # поставит Compress::Zlib и подвиснет в Archive::Zip
Ctrl-C
> install Bundle::CPAN  # поставит Archive::Zip

Обновляем нужные модули из тех, которые уже поставил emerge:

cpan
> install DBI
> install DBD::mysql    # тесты не пройдут
> look DBD::mysql       # нужно ручками задать параметры
perl Makefile.PL --testuser=root --testpassword=YOURPASS
Ctrl-D
> install DBD::mysql    # теперь тесты пройдут, а если нет, то возможно вы
                        # забыли запустить:
                        #   mysql_fix_privilege_tables YOURPASS
                        # после обновления mysql

Сносим Gentoo-шные - иначе будут юзаться они, хоть они и более старые и объясняем Gentoo что мы эти модули установили сами:

emerge -C dev-perl/DBD-mysql dev-perl/DBI
mkdir -p /etc/portage/profile
{ perl -le 'use DBI;        print "dev-perl/DBI-",       $DBI::VERSION';
  perl -le 'use DBD::mysql; print "dev-perl/DBD-mysql-", $DBD::mysql::VERSION';
} >> /etc/portage/profile/package.provided

Обновляем уже установленные (в основном - идущие в комплекте с perl) модули:

cpan
> upgrade
Warning Судя по всему, в процессе этого апгрейда обновляется модуль Pod::Man, который идёт в комплекте в perl, причём он заменяет файлы прямо в /usr/lib/perl5/5.8.8/, вместо того чтобы установить новую версию в /usr/lib/perl5/site_perl/5.8.8/. И в результате perldoc Module::Name перестаёт выводить русский (man Module::Name работает нормально). В принципе, вероятно, так и задумано - невозможно корректно обработать что-либо кроме UTF8 в POD-документации т.к. в ней невозможно задать кодировку, вот русский в KOI8 и слетает. Но переводить всю документацию в UTF8 я пока не планирую, поэтому рекомендую взять Man.pm шедший в комплекте с perl-5.8.8 и положить его ручками в /usr/lib/perl5/site_perl/5.8.8/Pod/.

Install

А теперь устанавливаем все нужные модули:
cpan
> install Compress::Zlib
> install version
> install Business::CreditCard
> install Crypt::RC4
> install Data::Alias
> install Digest::SHA1
> install GD
> install HTML::Parser
> install HTML::Strip
> install Inline
> install JavaScript::SpiderMonkey
> install JSON::XS
> install List::MoreUtils
> install LWP
> install Math::Pari
> install Module::Install
> install Export::Attrs
> install Smart::Comments
> install Term::ReadKey
> install Term::ReadLine::Gnu
> install Test::Differences
> install Test::Distribution
> install Test::Exception
> install Test::MockModule
> install Test::Pod
> install Test::Pod::Coverage
> install Regexp::Common
> install POWER::Utils
> install POWER::Utils::Resource
> install POWER::Utils::HexDump
> install POWER::Utils::IO
> install POWER::GPG
> install POWER::Email
> install POWER::LOG
> install POWER::iCGI
> install POWER::Tree
> install POWER::SQL
> install Regexp::Common::RealHTML
> install Regexp::Common::Fast
> install POWER::NB::IO
> install POWER::NB::Resolver
> install POWER::SSL
> install POWER::Multi::GET
> install POWER::Epoll
> install POWER::Event
> install POWER::Event::Timer
> install POWER::Event::IO