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, часть вообще устанавливалась под предыдущими версиями 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
emerge -aB 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*
emerge -K perl
emerge -uDNa world
|
|
Естественно, для последнего пункта неплохо чтобы у вас система была уже обновлена и 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, так что на следующем этапе эту проблему нужно будет решить. |
Обновляем 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
|
|
Судя по всему, в процессе этого апгрейда обновляется модуль 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/. |
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 Perl6::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