web-dev-qa-db-fra.com

Comment puis-je désinstaller un module Perl installé via `cpan`?

J'utilise Perl en cours d'exécution dans l'espace utilisateur (non installé via root) et j'installe des modules via la ligne de commande cpan. Je voudrais savoir s'il existe un moyen simple de supprimer un module sans avoir à faire beaucoup de travail pour supprimer des fichiers individuels.

J'ai cherché cette question sur Internet et trouvé des réponses, mais les réponses que j'ai trouvées semblent discuter de l'utilisation du gestionnaire de packages Perl (spécifique pour Microsoft Windows), sinon spécifique du système d'exploitation (BSDpan), suggérant d'utiliser cpanplus (qui J'ai eu plusieurs mauvaises expériences avec), ou j'ai fini par pointer vers un lien mort comme suit: http://www.cpan.org/misc/cpan-faq.html#How_delete_Perl_modules.

Ma question est précisément de savoir s'il existe un moyen propre de supprimer un module installé via cpan.

63
user181548

Tu ne peux pas. Il n'y a pas de fonctionnalité dans mon client CPAN pour faire une telle chose. Nous parlions de la façon dont nous pourrions faire quelque chose comme ça lors de l'atelier Perl QA de ce week-end, mais c'est généralement difficile pour toutes les raisons mentionnées par Ether.

39
brian d foy
  1. Installer App::cpanminus de CPAN (utilisez: cpan App::cpanminus pour ça).
  2. Tapez cpanm --uninstall Module::Name (notez le "m") pour désinstaller le module avec cpanminus.

Cela devrait fonctionner.

46
Aedla

En règle générale, il n'y a pas de mécanisme de "désinstallation" spécifique fourni avec les modules CPAN. Mais vous pourriez essayer make uninstall dans le répertoire d'origine du module décompressé (c'est souvent sous /root/.cpan ou ~/.cpan), car certains packages contiennent cette directive dans leur script d'installation. (Cependant, puisque vous avez installé des modules dans un répertoire de bibliothèque local (non root), vous avez également la possibilité de supprimer tout ce répertoire et de réinstaller tout le reste que vous souhaitez conserver.)

La plupart du temps, vous pouvez simplement vous en sortir en supprimant le A/B.pm fichier (pour le A::B module) de votre perllib - cela rendra au moins le module inutilisable. La plupart des modules contiennent également une liste de fichiers à installer (appelé "manifeste"), donc si vous pouvez trouver cela, vous saurez quels fichiers vous pouvez supprimer.

Cependant, aucune de ces approches ne traitera les modules installés en tant que dépendances. Il n'y a pas de bon moyen (automatisé) de savoir si quelque chose d'autre dépend de ce module, vous devrez donc également le désinstaller manuellement une fois que vous êtes sûr.

La difficulté de désinstaller les modules est l'une des raisons pour lesquelles de nombreux développeurs Perl s'orientent vers l'utilisation d'un système de contrôle des révisions pour suivre les installations - par exemple voir le article de brian d foy en complément de son prochain livre qui traite de l'utilisation de git pour la gestion des paquets.

29
Ether

Il existe des scripts sur CPAN qui tentent de désinstaller les modules:

ExtUtils :: Packlist montre un exemple de module supprimant le code, modrm.

23
bsb

Mise à jour 2013: ce code est obsolète. Upvote réponse tardive de bsb à la place.


Je n'ai pas besoin de désinstaller souvent les modules, mais le .packlist L'approche basée sur les fichiers ne m'a jamais échoué jusqu'à présent.

use 5.010;
use ExtUtils::Installed qw();
use ExtUtils::Packlist qw();

die "Usage: $0 Module::Name Module::Name\n" unless @ARGV;

for my $mod (@ARGV) {
    my $inst = ExtUtils::Installed->new;

    foreach my $item (sort($inst->files($mod))) {
        say "removing $item";
        unlink $item or warn "could not remove $item: $!\n";
    }

    my $packfile = $inst->packlist($mod)->packlist_file;
    print "removing $packfile\n";
    unlink $packfile or warn "could not remove $packfile: $!\n";
}
17
daxim

Puisqu'au moment de l'installation de n'importe quel module, il a principalement mis les fichiers .pm correspondants dans les répertoires respectifs. Donc, si vous souhaitez supprimer le module uniquement à des fins de test ou temporairement, il est préférable de trouver le chemin où le module est stocké à l'aide de perldoc -l <MODULE>, puis déplacez simplement le module à partir de là vers un autre emplacement. Cette approche peut également être essayée comme une solution plus permanente mais je n'ai pas conscience de conséquences négatives car je le fais principalement pour les tests.

2
shivams