Как я могу деинсталлировать модуль Perl, установленный через "cpan"?

Я использую Perl, работающий в пользовательском пространстве (не установлен через root) и установка модулей через командную строку cpan. Я хотел бы знать, есть ли простой способ удалить модуль без необходимости выполнять большую работу по удалению отдельных файлов.

Я искал этот вопрос в интернете и нашел некоторые ответы, но ответы, которые я нашел, похоже, либо обсуждают использование диспетчера пакетов Perl( специфичного для Microsoft Windows), либо операционной системы (BSDpan), предлагая использовать cpanplus (с которым у меня было несколько плохих опытов), или закончил, указав на мертвую ссылку следующим образом: http://www.cpan.org/misc/cpan-faq.html#How_delete_Perl_modules.

мой вопрос заключается в том, есть ли чистый способ удалить модуль, установленный через cpan.

6 ответов


ты не можешь. В моем клиенте CPAN нет функции, чтобы сделать такую вещь. Мы говорили о том, как мы могли бы сделать что-то подобное на семинаре Perl QA в эти выходные, но это, как правило, трудно по всем причинам, которые упоминал эфир.


  1. установить App::cpanminus из CPAN (использовать: cpan App::cpanminus для этого).
  2. тип cpanm --uninstall Module::Name (обратите внимание на "m"), чтобы удалить модуль с cpanminus.

это должно работать.


как правило, нет конкретного механизма "удаления", который поставляется с модулями CPAN. Но вы можете попробовать make uninstall в исходном каталоге модуль распакован в (это часто находится под /root/.cpan или ~/.cpan), поскольку некоторые пакеты содержат эту директиву в своем сценарии установки. (Однако, поскольку вы установили модули в локальный (не корневой) каталог библиотеки, у вас также есть возможность сдуть весь этот каталог и переустановить все остальное, что вы хотите держать.)

много времени вы можете просто уйти с удалением (для A::B module) из вашего perllib -- это, по крайней мере, сделает модуль непригодным для использования. Большинство модулей также содержат список файлов для установки (называемый "манифестом"), поэтому, если вы сможете его найти, вы будете знать, какие файлы вы можете удалить.

однако ни один из этих подходов не будет обращаться к модулям, которые были установлены в качестве зависимостей. Нет хорошего (автоматизированного) способа узнать, если что-то еще зависит от этого модуля, поэтому вам придется удалить его вручную, как только вы будете уверены.

трудность удаления модулей является одной из причин, почему многие разработчики Perl переходят к использованию системы контроля версий для отслеживания установок - например, см. статья Брайана d foy в качестве дополнения к его предстоящей книге это обсуждает использование git для управления пакетами.


на CPAN есть скрипты, которые пытаются удалить модули:

ExtUtils::Packlist показывает образец модуля удаления кода,modrm.


Update 2013: этот код устарел. Upvote поздний ответ bsb.


мне не нужно часто удалять модули, но подход никогда не подводил меня до сих пор.

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

die "Usage:  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";
}

Так как на момент установки любого модуля он в основном ставил соответствующий.pm файлы в соответствующих каталогах. Поэтому, если вы хотите удалить модуль только для какой-то цели тестирования или временно лучше всего найти путь, где модуль хранится с помощью perldoc -l <MODULE> а затем просто переместите модуль оттуда в другое место. Этот подход также можно попробовать как более постоянное решение, но я не знаю никаких негативных последствий, поскольку я делаю это в основном для тестирования.