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

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

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

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

64
задан brian d foy 19 February 2016 в 17:59
поделиться

3 ответа

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

39
ответ дан 24 November 2019 в 15:44
поделиться

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

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

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

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

29
ответ дан 24 November 2019 в 15:44
поделиться

Обновление 2013 г .: Этот код устарел. Проголосуйте за поздний ответ bsb вместо этого.


Мне не нужно часто удалять модули, но подход на основе файлов .packlist до сих пор меня ни разу не подводил.

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
ответ дан 24 November 2019 в 15:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: