2010-04-13 5 views
47

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

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

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

+31

Вы действительно не можете придумать какой-либо причине, чтобы удалить любой модуль Perl из любой системы? – 2010-04-13 12:11:19

+1

Для управления пакетами используйте диспетчер пакетов, в котором нет CPAN. – jrockway

+4

Мне нужно избавиться от нескольких модулей, поэтому у меня будет свободное пространство на моем 2GB Raspberry Pi – Ray

ответ

34

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

+45

Это печально. :-( – cstamas

+0

У Python была та же проблема с 'setuptools'. Она была решена в' pip' с помощью метаданных пакета (или генерирования при установке), который включает в себя список файлов. –

+0

Python на самом деле не решает эту проблему. говорил о том же, что и в Perl, но он не будет работать надежно, потому что модули не могут сделать свои метаданные доступными. –

29

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

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

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

Сложность в удалении модулей является одной из причин, по которой многие разработчики Perl стремятся использовать систему контроля версий для отслеживания установок - например, см. раздел article by brian d foy as a supplement to his upcoming book, в котором обсуждается использование git для управления пакетами.

+3

Это не выдержка из книги. Это дополнительный материал, который вы не найдете в «Эффективном программировании на Perl». –

+0

«Нет хорошего (автоматизированного) способа узнать, зависит ли что-то от этого модуля» - почему нет способа узнать? – 2010-04-13 07:32:55

+1

@brian: Извините, я неправильно понял природу этого сайта! – Ether

16

Обновление 2013: Этот код устареет. Upvote bsb's late-coming answer вместо этого.


Мне не нужно, чтобы удалить модули часто, но подход, основанный на .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"; 
} 
+1

Это потрясающе - спасибо! –

22

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

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

+1

Я думаю, что реальный вопрос: есть ли что-то не так, просто удалив его из вашего каталога Perl? – felwithe

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

Это должно сработать.

+0

Кажется, что установка модуля 'App :: cpanminus' с' cpan App :: cpanminus' не устанавливает никакого инструмента 'cpanm', если я нахожу' cpanm -uninstall Module :: Name' I get '-bash: cpanm: command not found' на OS X. Я что-то упустил – tonix

+0

@tonix: Проверьте, находится ли его местоположение в вашей' $ PATH'. – reinierpost

+0

Это был старый комментарий. Вы имеете в виду использование 'fin d. -name '* cpanm' | grep -E 'cpanm''? – tonix

2

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