How can I de-install a Perl module installed via `cpan`?

113,166

Solution 1

You can't. There isn't a feature in my CPAN client to do such a thing. We were talking about how we might do something like that at this weekend's Perl QA Workshop, but it's generally hard for all the reasons that Ether mentioned.

Solution 2

  1. Install App::cpanminus from CPAN (use: cpan App::cpanminus for this).
  2. Type cpanm --uninstall Module::Name (note the "m") to uninstall the module with cpanminus.

This should work.

Solution 3

As a general rule, there is not a specific 'uninstall' mechanism that comes with CPAN modules. But you might try make uninstall in the original directory the module unpacked into (this is often under /root/.cpan or ~/.cpan), as some packages do contain this directive in their install script. (However, since you've installed modules into a local (non-root) library directory, you also have the option of blowing away this entire directory and reinstalling everything else that you want to keep.)

A lot of the time you can simply get away with removing the A/B.pm file (for the A::B module) from your perllib -- that will at least render the module unusable. Most modules also contain a list of files to be installed (called a "manifest"), so if you can find that, you'll know which files you can delete.

However, none of these approaches will address any modules that were installed as dependencies. There's no good (automated) way of knowing if something else is dependent on that module, so you'll have to uninstall it manually as well once you're sure.

The difficulty in uninstalling modules is one reason why many Perl developers are moving towards using a revision control system to keep track of installations -- e.g. see the article by brian d foy as a supplement to his upcoming book that discusses using git for package management.

Solution 4

There are scripts on CPAN which attempt to uninstall modules:

ExtUtils::Packlist shows sample module removing code, modrm.

Solution 5

Update 2013: This code is obsolescent. Upvote bsb's late-coming answer instead.


I don't need to uninstall modules often, but the .packlist file based approach has never failed me so far.

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";
}
Share:
113,166

Related videos on Youtube

brian d foy
Author by

brian d foy

I'm a Perl trainer and author. I'm the co-author of Programming Perl, Learning Perl, Intermediate Perl, and Effective Perl Programming, Programming Perl, and the author of Mastering Perl and Learning Perl 6.

Updated on March 31, 2020

Comments

  • brian d foy
    brian d foy about 4 years

    I am using Perl running in user space (not installed via root) and installing modules via the command-line cpan. I would like to know if there is a simple way to remove a module without having to do a lot of work deleting individual files.

    I searched for this question on the internet and found some answers, but the answers I've found seem to either discuss using the Perl package manager (specific for Microsoft Windows), otherwise operating-system specific (BSDpan), suggesting using cpanplus (which I've had several bad experiences with), or ended by pointing to a dead link as follows: http://www.cpan.org/misc/cpan-faq.html#How_delete_Perl_modules.

    My question is specifically whether there is a clean way to remove a module installed via cpan.

    • Admin
      Admin about 14 years
      You really can't think of any reason to want to remove any Perl module from any system?
    • jrockway
      jrockway about 14 years
      To manage packages, use a package manager -- which CPAN is not.
    • Ray
      Ray about 11 years
      I for one, need to get rid of a few modules so I will have space on my 2GB Raspberry Pi
    • AlwaysLearning
      AlwaysLearning over 9 years
      @AmbroseChapel: an obvious reason is to test code that detects whether end users have the required Perl module installed during start up. Which is where I'm at now. I guess I have to run up a clean VM to run that test instead.
    • felwithe
      felwithe over 8 years
      @AmbroseChapel "Why" is not necessary to answer a technical question.
    • FearlessHyena
      FearlessHyena about 6 years
      Use cpanp (cpanplus) as mentioned here
    • Richlv
      Richlv over 5 years
      And another reason (even though the original comment seems to be deleted) - you installed a module via cpan, then found out it's available in the distribution packages.
  • brian d foy
    brian d foy about 14 years
    That's not an excerpt from the book. It's extra stuff you won't find in Effective Perl Programming.
  • Admin
    Admin about 14 years
    "There's no good (automated) way of knowing if something else is dependent on that module" - why isn't there a way of knowing?
  • Ether
    Ether about 14 years
    @brian: ah sorry, I misunderstood the nature of that site then!
  • ivan_pozdeev
    ivan_pozdeev over 8 years
    Python had the same problem with setuptools. It was solved in pip by using (or generating upon installation) package metadata that includes the list of files.
  • brian d foy
    brian d foy over 8 years
    Python doesn't really solve that problem. People have been talking about doing the same thing in Perl, but it won't work reliably because modules may not make their metadata available.
  • felwithe
    felwithe over 8 years
    I guess the real question is: is there anything wrong with just deleting it from your Perl directory?
  • tonix
    tonix over 8 years
    It seems that installing the App::cpanminus module with cpan App::cpanminus doesn't install any cpanm tool, if I type cpanm --uninstall Module::Name I get -bash: cpanm: command not found on OS X. Am I missing something
  • reinierpost
    reinierpost about 7 years
    @tonix: Check if its location is in your $PATH.
  • tonix
    tonix about 7 years
    It was an old comment. Do you mean using find . -name '*cpanm' | grep -E 'cpanm' ?
  • Armand
    Armand over 6 years
    on a mac, you do not need to use find. It is much faster to use spotlight mdfind cpanm
  • Pablo Bianchi
    Pablo Bianchi about 6 years
    Using Perl v5.22.1 I did sudo cpan install "DateTime::Format::Builder", everything OK, then cpanm --uninstall "DateTime::Format::Builder" and I get is not found in the following directories and can't be uninstalled. Those are: /usr/local/lib/x86_64-linux-gnu/perl/5.22.1 and /usr/local/share/perl/5.22.1. I installed cpanm with sudo apt install cpanminus (v1.7040). Any Idea?
  • xeruf
    xeruf over 2 years
    This only uninstalls libs, not binaries from /usr/bin :/