Удалите все модули perl, установленные cpan

#perl #cpan

#perl #cpan

Вопрос:

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

 cpan -i Software
  

Я никогда не использовал cpan, я просто знаю, что это менеджер пакетов perl. (Это ..?) Однако оказалось, что мне нужно множество зависимостей, и, каким бы глупым я ни был, я просто установил их все. (Сначала мне пришлось настроить cpan, который задал мне много вопросов) Короче говоря, я просто хочу удалить все это снова. Я немного погуглил, и похоже, что cpan не имеет процедуры удаления, особенно для всех пакетов сразу.
Могу ли я просто удалить какой-либо каталог или у меня возникнут проблемы?

Ответ №1:

cpan команда на самом деле не является менеджером пакетов, как apt-get is. Это скорее инструмент, который загружается и устанавливается с CPAN (сайта или одного из его зеркал). После завершения этой задачи он мало что помнит о том, что было сделано раньше, по крайней мере, недостаточно для удаления ранее установленных модулей, по крайней мере, ненадежно, чисто или безопасно для зависимостей. (Обновление: после просмотра App::pmuninstall его можно использовать для обработки зависимостей, но он делает это путем подключения к внешним (читай: веб) источникам, которые вычисляют их отдельно, что нормально, но я придерживаюсь предыдущего утверждения, что CPAN.pm не делает этого.)

Раньше я беспокоился об удалении модулей, но теперь я понимаю, что большинство модулей Perl занимают так мало места, что я просто не беспокоюсь о том, чтобы установить несколько дополнительных модулей, которые вы никогда не будете использовать. Поэтому, если вы не используете компьютер с ДЕЙСТВИТЕЛЬНО маленьким диском, я бы просто оставил это в покое.

В Windows или, если вы используете несистемный Perl в Linux / Mac, вы можете просто удалить Perl и переустановить его. Я бы не рекомендовал этого, если вы используете Perl, установленный в системе, на Linux / Mac, однако, поскольку вы можете сломать свою ОС, делая это (возможно, все будет в порядке, если вы будете осторожны, но не стоит экономить несколько Мб!).

В будущем вы можете легко установить локальную версию Perl с помощью perlbrew, в Интернете есть учебные пособия, если документов недостаточно (они должны быть). Это также дает бонус, позволяющий вам играть с новейшими и лучшими версиями Perl, которые, вероятно, еще не поставляются с вашей системой. Затем, если вы устанавливаете гору мусора или даже ломаете его, делая что-то сумасшедшее, удалите эту версию и переустановите / установите другую версию.

Другим приятным инструментом является cpanminus (или сокращенно cpanm), который является более новым и удобным для пользователя инструментом cpan. Все крутые ребята используют его.

Комментарии:

1. Спасибо за хорошее объяснение. Я немного углубился в каталоги библиотек и решил сохранить все эти файлы, как вы предложили.

2. @xenoterracide зависит ли это от использования cpanm для установки? беглый взгляд на документ, казалось, предполагал это. в любом случае, я не вижу необходимости удалять практически любой из модулей CPAN, по крайней мере, с точки зрения хранения данных. Тем не менее, приятно знать, что что-то существует

3. нет, cpanm afaik ничего не делает, кроме как записывать это cpan и cpanp делать.

4. круто 1! Я замечаю, что он отправляется в Интернет для поиска зависимостей, но, учитывая ограничения, которые CPAN.pm черт возьми, я рад, что они что-то придумали, а не игнорировали их!

5. Я просто смотрел на это и думал, что одна из причин удаления модулей заключается в том, что когда вы разрабатываете один из них, вы удаляете один из его модулей в выпуске разработчика, но он все еще установлен и, следовательно, находится в вашей библиотеке. Удаление его — лучшая идея.

Ответ №2:

Вы можете удалить отдельные модули с помощью cpanplus (поставляется с Perl) следующим образом:

 cpanp uninstall SQL::Abstract
  

Вы можете просмотреть все модули, установленные с помощью скрипта cpan, следующим образом:

 perldoc perllocal
  

Объединение двух:

 for module in $(perldoc -u perllocal | grep -F 'C<Module> L<' | sed 's/^.*L<(.*)|.*>$/1/') ; do
    cpanp uninstall "$module"
done
  

Комментарии:

1. Я предполагаю, что строка 2 скрипта должна быть cpanm --uninstall "$module"

2. или cpan uninstall "$module"

Ответ №3:

Я не уверен в удалении «всего этого». Но для удаления одного модуля вы можете использовать App::pmuninstall его единственный скрипт pm-uninstall для удаления модулей. Возможно, тогда вы сможете написать какой-нибудь скрипт для рекурсивного удаления dep.

Ответ №4:

Если вы больше не можете использовать cpan из-за несовместимых модулей в вашем пути, вы можете удалить все установленные модули вручную. Например, я обновился с Fedora 22 до Fedora 23, и версия Perl изменилась. Все модули, установленные ранее через cpanm into /usr/local/lib64/perl5 , больше не работали и не позволяли мне использовать cpanm.

 $ cpanm --uninstall Apache::DBI
Attempt to reload Scalar/Util.pm aborted.
Compilation failed in require at /usr/share/perl5/vendor_perl/File/Temp.pm line 18.
...
  

Я мог бы решить эту проблему, переместив этот каталог:

 $ mv /usr/local/lib64/perl5 /root/usr-local-lib64-perl5
  

Имя этого каталога может отличаться в вашей системе.

Осторожно: если модуль установил файлы за пределами этого каталога, например файлы системной библиотеки, эти файлы останутся там.

Ответ №5:

Я изменю ответ Flimm на использование cpanm и, при необходимости, удалю сам cpanm в конце скрипта:

 #!/usr/bin/env bash

for module in $(perldoc -u perllocal | grep -F 'C<Module> L<' | sed 's/^.*L<(.*)|.*>$/1/' | sort | uniq) ; do
    if [[ "$module" =~ "App::cpanminus" ]]; then
        continue
    fi
    echo "Uninstalling $module..."
    yes | cpanm --uninstall "$module"
done

cpanm --uninstall App::cpanminus
  

Ответ №6:

Я думаю, что лучший вариант — удалить Perl и установить его снова.

Комментарии:

1. Единственная проблема с этим предложением заключается в том, что вам НЕ следует этого делать, если вы используете общесистемную установку на Linux / Mac. Если вы используете Windows, то это, вероятно, предпочтительнее.