Porque removê-los?
Em meu caso, remover os módulos
CPAN se apoia ao fato de que já empacotei os mesmos tanto no Debian, quanto no Slackware, portanto, não preciso de um mesmo módulo instalado em 2 locais diferentes (todos vistos na imagem abaixo) no Slackware e de alguns para o caso do Debian.
O que nos leva ao tópico do post, é a dificuldade em remover tais módulos sem o uso de algum módulo extra do CPAN! Oras, se quero deixar meu sistema limpo, vou instalar mais trecos nele?
Soluções
Antes de começar informo que o foco deste tutorial é o uso do CPAN como root e não rodando-o localmente como usuário normal "local::lib", se este for o seu caso as coisas mudam de figura.
Abaixo, veremos diferentes métodos para remover os tais módulos.
1. O modo certo:
(rsrs) Caso alguém saiba como remover tais módulos do jeito correto, por favor me avisem! (kkk)
2. Via script:
Via script, podemos criar um script Perl, contendo o seguinte:
# uninstall_perl_module.pl from PerlTricks.com
use 5.14.2;
use ExtUtils::Installed;
use ExtUtils::Packlist;
# Exit unless a module name was passed
die ("Error: no Module::Name passed as an argument. E.G.\n\t perl $0 Module::Name\n") unless $#ARGV == 0;
my $module = shift @ARGV;
my $installed_modules = ExtUtils::Installed->new;
# iterate through and try to delete every file associated with the module
foreach my $file ($installed_modules->files($module)) {
print "removing $file\n";
unlink $file or warn "could not remove $file: $!\n";
}
# delete the module packfile
my $packfile = $installed_modules->packlist($module)->packlist_file;
print "removing $packfile\n";
unlink $packfile or warn "could not remove $packfile: $!\n";
# delete the module directories if they are empty
foreach my $dir (sort($installed_modules->directory_tree($module))) {
print("removing $dir\n");
rmdir $dir or warn "could not remove $dir: $!\n";
}
O script acima foi publicado originalmente em:
Salve-o com o nome que quiser, aqui atribui o nome "uninstall_perl_module.pl" tal como apresentado no link acima, salvei-o em
/usr/local/bin e dei-lhe permissão de execução.
Logue-se como root, e entre no shell CPAN e instale os módulos ExtUtils::Installed e ExtUtils::Packlist.1
su
# perl -MCPAN -e shell
cpan[1]>
install ExtUtils::Installed
cpan[2]>
install ExtUtils::Packlist
cpan[3]>
exit
# exit
exit
Daí, caso saiba qual módulo remover, use como exemplo:
sudo perl /usr/local/bin/uninstall_perl_module.pl App::cpanminus
Bem, resolve, mas não acho que ficou legal!
3. O modo tosco:
O modo tosco seria acessar a pasta do módulo, geralmente, salva em "#.cpan/build", como em
/root/.cpan/build/File-DesktopEntry-0.08-rvcloY/, e rodar um:
# make uninstall
Somente isso já lhe daria o caminho das pedras, digo, quem remover, exemplo:
# make uninstall
Uninstall is unsafe and deprecated, the uninstallation was not performed.
We will show what would have been done.
unlink /usr/local/share/man/man3/File::DesktopEntry.3
unlink /usr/local/share/perl5/File/DesktopEntry.pm
unlink /usr/local/lib/perl5/auto/File/DesktopEntry/.packlist
Uninstall is unsafe and deprecated, the uninstallation was not performed.
Please check the list above carefully, there may be errors.
Remove the appropriate files manually.
Sorry for the inconvenience.
Como visto acima, todas as linhas começadas por "unlink", referem-se ao que foi instalado. Infelizmente, o "make uninstall" não fará o trabalho para você, daí bastaria remover cada arquivo individualmente:
# rm -fv /usr/local/share/man/man3/File::DesktopEntry.3
# rm -fv /usr/local/share/perl5/File/DesktopEntry.pm
# rm -fv /usr/local/lib/perl5/auto/File/DesktopEntry/.packlist
E pronto! Mas há um jeitinho melhor.
4. O modo bruto:
No modo dos brutos, as coisas funcionam perfeitamente, seja removendo apenas um módulo CPAN, como o ExtUtils:
find /usr/local/lib/perl5/auto/ExtUtils/ -name '*.packlist' -exec cat >> remove_extutils.txt {} \;
cat remove_extutils.txt | xargs -l1 sudo rm -fv
sudo rm -rf /usr/local/share/perl5/ExtUtils
sudo rm -rf /usr/local/lib/perl5/auto/ExtUtils
Ou todos os módulos instalados via CPAN:
find /usr/local/lib/perl5/auto/ -name '*.packlist' -exec cat >> remove_modules.txt {} \;
cat remove_modules.txt | xargs -l1 sudo rm -fv
sudo rm -rf /usr/local/lib/perl5
sudo rm -rf /usr/local/share/perl5
Querendo passar um pente-fino em
/usr/local, podemos remover pastas vazias e checar se ficou algo estranho em
/usr/local/bin, com:
*Antes de executar os comandos, leia a informação abaixo!!!
du -h /usr/local/lib/perl5
du -h /usr/local/share/perl5
du -h /usr/local/share/man
du -h /usr/local/man
sudo rm -rf /usr/local/lib/perl5
sudo rm -rf /usr/local/share/perl5
sudo rm -rf /usr/local/man
ls /usr/local/bin/
*Obviamente, sugiro que verifique todas as pastas acima antes de removê-las, isso porque, às vezes, instalamos pacotes da maneira tradicional:
# ./configure && make
# make install
E quando não especificamos a opção "prefix= do ./configure", é para
/usr/local, onde geralmente esses programas são instalados!
Caso queira ganhar mais algum espaço em disco, remova também as pastas ".cpan" e ".cpanplus" no diretório do root:
sudo rm -rf /root/.cpanplus
sudo rm -rf /root/.cpan
Sistema limpo, divirtam-se! O mlocate agradece!
Referência