Jak mogę dezinstalować moduł Perla zainstalowany przez 'cpan'?

Używam Perla działającego w przestrzeni użytkownika (nie zainstalowanego przez roota) i instaluję moduły za pomocą wiersza poleceń cpan. Chciałbym się dowiedzieć, czy istnieje prosty sposób na usunięcie modułu bez konieczności wykonywania dużej pracy przy usuwaniu poszczególnych plików.

Szukałem tego pytania w Internecie i znalazłem kilka odpowiedzi, ale odpowiedzi, które znalazłem, wydają się albo omawiać użycie Menedżera pakietów Perla (specyficznego dla Microsoft Windows), inaczej specyficznego dla systemu operacyjnego (BSDpan), sugerując korzystanie z cpanplus (z którym miałem kilka złych doświadczeń), lub zakończył się wskazaniem na martwy link w następujący sposób: http://www.cpan.org/misc/cpan-faq.html#How_delete_Perl_modules.

Moje pytanie dotyczy w szczególności, czy istnieje czysty sposób na usunięcie modułu zainstalowanego przez cpan.

Author: brian d foy, 2010-04-13

6 answers

Nie możesz. nie ma funkcji w moim kliencie CPAN, aby zrobić coś takiego. Rozmawialiśmy o tym, jak możemy zrobić coś takiego na weekendowych warsztatach PERL QA, ale generalnie jest to trudne ze wszystkich powodów, o których wspomniał Ether.

 37
Author: brian d foy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-21 20:24:09
  1. Zainstaluj App::cpanminus z CPAN (użyj do tego: cpan App::cpanminus).
  2. Wpisz cpanm --uninstall Module::Name (zwróć uwagę na "m"), Aby odinstalować moduł za pomocą cpanminus.
To powinno zadziałać.
 32
Author: Aedla,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-16 19:49:03

Ogólnie rzecz biorąc, nie ma określonego mechanizmu 'odinstalowywania', który jest dostarczany z modułami CPAN. Ale możesz spróbować make uninstall w oryginalnym katalogu, do którego moduł się rozpakował (często jest to pod /root/.cpan lub ~/.cpan), ponieważ niektóre pakiety zawierają tę dyrektywę w swoim skrypcie instalacyjnym. (Jednak, ponieważ zainstalowałeś Moduły w lokalnym (nie-rootowym) katalogu biblioteki, masz również możliwość zdmuchnięcia całego tego katalogu i ponownej instalacji wszystkiego innego, co chcesz zatrzymaj.)

Przez większość czasu możesz po prostu uciec od usunięcia pliku A/B.pm (dla modułu A::B) z twojego perllib-co przynajmniej uczyni moduł bezużytecznym. Większość modułów zawiera również listę plików do zainstalowania( zwaną "manifestem"), więc jeśli to znajdziesz, będziesz wiedział, które Pliki możesz usunąć.

Jednak żadne z tych podejść Nie dotyczy modułów, które zostały zainstalowane jako zależności. Nie ma dobrego (zautomatyzowanego) sposobu dowiedzenia się, czy coś innego jest w zależności od tego modułu, więc będziesz musiał odinstalować go ręcznie, jak również, gdy jesteś pewien.

Trudność w odinstalowaniu modułów jest jednym z powodów, dla których wielu programistów Perla zmierza w kierunku używania systemu kontroli wersji do śledzenia instalacji - np. zobacz artykuł Briana d Foya jako dodatek do jego nadchodzącej książki , w którym omawia się używanie Gita do zarządzania pakietami.

 29
Author: Ether,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-16 18:37:30

Istnieją Skrypty na CPAN, które próbują odinstalować Moduły:

ExtUtils:: Packlist pokazuje przykładowy moduł usuwający kod, modrm.

 22
Author: bsb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-29 13:45:26

Aktualizacja 2013: ten kod jest przestarzały. Upvote późna odpowiedź bsb zamiast.


Nie muszę często odinstalowywać modułów, ale podejście oparte na plikach .packlist do tej pory nigdy mnie nie zawiodło.

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";
}
 16
Author: daxim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:30

Ponieważ w momencie instalacji dowolnego modułu umieszczał on głównie odpowiednie pliki. pm w odpowiednich katalogach. Więc jeśli chcesz usunąć moduł tylko w celach testowych lub tymczasowo najlepiej jest znaleźć ścieżkę, gdzie moduł jest przechowywany za pomocą perldoc -l <MODULE>, a następnie po prostu przenieść moduł stamtąd do innej lokalizacji. Takie podejście można również wypróbować jako bardziej trwałe rozwiązanie, ale nie jestem świadomy żadnych negatywnych konsekwencji, ponieważ robię to głównie dla testów.

 2
Author: shivams,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-21 05:44:09