为了开发,我安装了自己的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