爲了開發,我安裝了自己的Perl,並讓系統Perl獨自一人。如果我想升級系統Perl,我使用系統包管理器。對於我的Perl開發,我使用cpan工具。因爲我將這些分離開來,所以我絕對不應該搞砸系統爲其維護任務等所需的Perl,但我不必依靠系統的開發決策。
安裝單獨的Perls非常簡單。當您從源代碼分發中運行Configure時,它會詢問您要在何處安裝所有內容。給它任何你喜歡的路徑。例如,我在/usr/local/perls中安裝了許多Perls,並且每個安裝的所有內容都單獨存在。然後,我爲它們在/usr/local/bin(如perl5.8.9,perl.5.10.0,perl5.10.0-線程)中創建符號鏈接。當我需要一個特定的版本,我只是用一個我想要的:在特定的二進制確保該方案拿起正確模塊搜索路徑等(它在配置相同的東西
$ perl5.10.0 program.pl
。pm模塊)。
這是我用來創建符號鏈接的腳本。它在bin目錄中查找,找出Perl版本,並生成鏈接,如cpan5.10.1
等。每個程序已經知道正確的Perl調用:
#!perl
use 5.010;
use strict;
use warnings;
use File::Basename;
use File::Spec::Functions;
my $perls_directory = catfile(
$ARGV[0] // '/usr/local/perls',
'perl*'
);
die "$perls_directory does not exist!\n"
unless -d dirname $perls_directory;
my $links_directory = $ARGV[1] // catfile($ENV{HOME}, 'bin'); #/
die "$links_directory does not exist!\n" unless -d $links_directory;
foreach my $directory (glob($perls_directory))
{
say "Processing $directory...";
unless(-e catfile($directory, 'bin'))
{
say "\tNo bin/ directory. Skipping!";
next;
}
my @perls = glob(catfile($directory, qw(bin perl5*)));
my($perl_version) = $perls[0] =~ m/(5\.\d+\.\d+)\z/;
say "\tperl version is $perl_version";
foreach my $bin (glob(catfile($directory, 'bin', '*')))
{
say "\tFound $bin";
my $basename = basename($bin);
my $link_basename = do {
if($basename =~ m/5\.\d+\.\d+\z/) { $basename }
else { "$basename$perl_version" }
};
my $link = catfile($links_directory, $link_basename);
next if -e $link;
say "\t\tlinking $bin => $link";
symlink $bin => $link or
warn "\t\tCould not create symlink [$!]: $bin => $link!";
}
}
一切都安裝在該特定的Perl的正確位置。
我也一直在想,我應該把這些Perl目錄放在某種源代碼控制之下。如果我添加一個我不喜歡的模塊,我只是退回到以前的版本。我只是開始這樣做,並沒有玩得太多。
我已經寫了更多關於這種事情在有效Perler博客:
我已將標題從「如何在Linux上管理Perl模塊?到「如何在使用包管理器時管理Perl模塊?「,因爲這與任何包管理器可能用於安裝Perl本身的系統有關,而不是嚴格的Linux - 例如OSX的macports(http://macports.org)發行版 – Ether 2009-12-29 00:48:01