Quitar un módulo de Perl

Si utilizamos PPM para administrar módulos de Perl tenemos todas las herramientas allí mismo, incluso la posibilidad de quitar un módulo. Pero en el caso de que hayamos usado CPAN esa opción no está disponible. Podemos borrar manualmente los archivos pero puede quedarnos algún resto olvidado.

Estuve buscando alternativas hasta que encontré un script que se encarga de ellos, invocándolo con un módulo como argumento. Su funcionamiento se basa en el módulo ExtUtils de Perl. El mismo borra todos los archivos asociados y los directorios vacíos.

Creen un archivo con el nombre remove_module.pl, copien el siguiente código dentro y guárdenlo en un directorio conocido:

# remove_module.pl from PerlTricks.com

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";
}

Aclaraciones:

El método directory_tree() trae todos los directorios contenidos en las rutas donde existan archivos del módulo (incluyendo el directorio raíz ej: c:\) y luego intenta borrarlos. No se preocupen porque solamente lo hará si están vacíos.

Si bien existe otro método, directories(), que trae solamente los directorios del módulo, esta limitado a aquellos de mayor nivel de profundidad

 

Entonces si lo que deseamos es quitar el módulo DBass, abrimos una línea de comandos y nos ubicamos en el directorio donde guardamos el script y ejecutamos mediante:

perl remove_module.pl DBass

removing C:/Perl/site/lib/DBass.pm
removing C:/Perl/html/site/lib/DBass.html
removing C:/Perl/site/lib/auto/DBass/.packlist
removing C:/
could not remove C:/: Directory not empty
removing C:/Perl
could not remove C:/Perl: Directory not empty
removing C:/Perl/html
could not remove C:/Perl/html: Directory not empty
removing C:/Perl/html/site
could not remove C:/Perl/html/site: Directory not empty
removing C:/Perl/html/site/lib
could not remove C:/Perl/html/site/lib: Directory not empty
removing C:/Perl/site
could not remove C:/Perl/site: Directory not empty
removing C:/Perl/site/lib
could not remove C:/Perl/site/lib: Directory not empty

Basado en:

http://perltricks.com/article/3/2013/3/27/How-to-cleanly-uninstall-a-Perl-module

Tagged with: , , ,
Publicado en Aplicaciones