ユーザー空間で実行されている(root経由ではインストールされない)Perlを使用し、コマンドラインcpan
経由でモジュールをインストールしています。個々のファイルを削除する多くの作業を行わずにモジュールを削除する簡単な方法があるかどうかを知りたいです。
私はインターネットでこの質問を検索し、いくつかの答えを見つけましたが、私が見つけた答えは、Perlパッケージマネージャー(Microsoft Windowsに固有)を使用して議論しているようです。私はいくつかの悪い経験をしました)、または次のようにデッドリンクを指すことで終了しました:http://www.cpan.org/misc/cpan-faq.html#How_delete_Perl_modules
。
私の質問は、cpan
を介してインストールされたモジュールを削除するクリーンな方法があるかどうかです。
できません。私のCPANクライアントには、そのようなことをする機能はありません。今週末のPerl QAワークショップで、そのようなことをどのように行うかについて話していましたが、Etherが言及したすべての理由のために、一般的に難しいです。
App::cpanminus
CPANから(使用:cpan App::cpanminus
このため)。cpanm --uninstall Module::Name
(「m
」に注意)cpanminusでモジュールをアンインストールします。これは動作するはずです。
一般的なルールとして、CPANモジュールに付属する特定の「アンインストール」メカニズムはありません。ただし、make uninstall
モジュールが展開された元のディレクトリ内(これは多くの場合/root/.cpan
または ~/.cpan
)。一部のパッケージにはインストールスクリプトにこのディレクティブが含まれているためです。 (ただし、ローカル(非ルート)ライブラリディレクトリにモジュールをインストールしているため、このディレクトリ全体を削除して、保持する必要のあるすべてを再インストールすることもできます。)
多くの場合、A/B.pm
ファイル(A::B
module)perllibから-少なくともモジュールを使用できなくします。ほとんどのモジュールには、インストールするファイルのリスト(「マニフェスト」と呼ばれます)も含まれているため、それが見つかった場合は、削除できるファイルがわかります。
ただし、これらのアプローチはいずれも、依存関係としてインストールされたモジュールに対処しません。他の何かがそのモジュールに依存しているかどうかを知る良い(自動化された)方法はないので、確信ができたら手動でアンインストールする必要があります。
モジュールのアンインストールの難しさは、多くのPerl開発者がインストールを追跡するためにリビジョン管理システムを使用する方向に動いている理由の1つです。パッケージ管理にgitを使用することについて説明している 近日公開予定の本の補足としてのbrian d foyによる記事 を参照してください。
モジュールのアンインストールを試みるスクリプトがCPANにあります。
ExtUtils :: Packlist は、サンプルモジュール削除コードmodrm
を示します。
更新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";
}
モジュールのインストール時には、主に対応する.pmファイルをそれぞれのディレクトリに配置するためです。したがって、テスト目的でのみモジュールを削除する場合、または一時的に最善の方法は、perldoc -l <MODULE>
を使用してモジュールが格納されているパスを見つけて、そこから他の場所にモジュールを移動することです。このアプローチは、より恒久的な解決策としても試すことができますが、主にテストのために行うため、マイナスの結果は認識していません。