2011-10-15 490 views
19

昨天所有Perl模塊我想測試一些軟件和文檔它說,安裝我只需要鍵入卸載由CPAN安裝

cpan -i Software 

我從來沒有使用過CPAN,我只知道,它是perl軟件包管理器。 (它是..?)然而,事實證明,我需要大量的依賴關係,並且像我一樣愚蠢,我只是安裝了所有它們。 (首先,我必須設置cpan,它問了我很多問題)長話短說,我只是想再次刪除它。我google了一下,似乎cpan沒有卸載例程,特別是對於所有的包一次。 我可以刪除一些目錄嗎?還是會遇到麻煩?

回答

27

cpan命令是不是真的像apt-get是一個包管理器是。它更多的是從CPAN(網站或其鏡像之一)下載和安裝的工具。完成此任務後,它不記得之前做了什麼,至少不足以刪除以前安裝的模塊,至少不能可靠,乾淨地或依賴性地安全。 (更新:在看過App::pmuninstall之後,它可以用來處理依賴關係,但是它通過連接到外部(read:web)源(它們分別計算這些源)來做到這一點,這很好,但我支持之前的說法CPAN.pm不這樣做)

我曾經擔心刪除模塊,但現在我意識到大多數Perl模塊佔用的空間很小,我只是不擔心安裝了一些額外的模塊,你永遠不會使用。所以除非你在一臺配有真正小碟的電腦上,否則我會放過它。

在Windows上或者如果您在Linux/Mac上使用非系統Perl,您可以刪除Perl並重新安裝它。如果您在Linux/Mac上使用安裝了Perl的系統,我不會推薦這種方法,但是您可能會因此破壞操作系統(如果您小心,可能會好起來,但不值得保存幾MB!)。

將來,您可以使用perlbrew輕鬆安裝本地版本的Perl,如果文檔不夠(應該是),那麼網上有教程。這也可以讓你玩最新最好的Perl版本,而你的系統可能還沒有出現。然後,如果你安裝了一堆垃圾,甚至破壞它做一些瘋狂的事情,請刪除該版本並重新安裝/安裝不同的版本。

另一個不錯的工具是cpanminus(或簡稱cpanm),它是一個更新,更友好的cpan工具。所有酷酷的孩子都在使用它。

+1

謝謝你的好解釋。我深入瞭解lib目錄並決定保留所有這些文件,正如你所建議的那樣。 – janoliver

+0

'pm-uninstall'可以刪除模塊。 – xenoterracide

+0

@xenoterracide是否依賴於使用cpanm進行安裝?粗略瀏覽文檔似乎表明這一點。無論如何,我不認爲有必要卸載CPAN上的幾乎任何模塊,至少從數據存儲的角度來看。仍然很高興知道有什麼東西存在 –

0

我認爲最好的選擇是卸載Perl並重新安裝。

+7

此建議的唯一問題是,您不應該這樣做是因爲您正在Linux/Mac上使用系統範圍的安裝。如果你在Windows上,那麼這實際上可能是首選。 –

2

我不知道要刪除「所有」。但是要刪除單個模塊,您可以使用App::pmuninstall和它的唯一腳本pm-uninstall來卸載模塊。然後,您可以編寫某種腳本來遞歸刪除代碼。

13

可以卸載各個模塊與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」' –

1

如果您不能再使用cpan,因爲您的系統中有不兼容的模塊路徑,您可以手動刪除所有安裝的模塊。例如,我從Fedora 22升級到Fedora 23,Perl版本改變了。之前通過cpanm安裝到/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 

該目錄的名稱可能會在系統上會有所不同。

小心:如果一個模塊安裝在該目錄之外的文件,例如系統庫文件,這些文件將保留在那裏。