为了进行开发,我安装了自己的 Perl,并保留了系统 Perl。如果我想升级系统 Perl,我会使用系统包管理器。对于我的 Perl 开发,我使用 cpan 工具。
由于我将它们分开,因此我永远不会弄乱系统维护任务等所需的 Perl,但我不必依赖系统的决策来进行开发。
安装单独的 Perls 非常容易。当您从源发行版运行配置时,它会询问您要将所有内容安装在哪里。给它任何你喜欢的路径。我安装了很多 Perls/usr/local/perls例如,每个安装的所有内容都是分开的。然后我在中创建符号链接/usr/local/bin对于他们(例如 perl5.8.9、perl.5.10.0、perl5.10.0 线程)。当我想要特定版本时,我只使用我想要的版本:
$ perl5.10.0 program.pl
特定的二进制文件可确保程序选择正确的模块搜索路径等(与该二进制文件的 Config.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 目录置于某种源代码控制之下。如果我添加了一个我不喜欢的模块,我就会退回到较早的版本。不过我才刚刚开始这样做,还没有玩过太多。
我在Effective Perler 博客中写了更多关于此类事情的文章:
- 建立每个版本工具的链接。 http://www.effectiveperlprogramming.com/2010/03/make-links-to-per-version-tools/
- 使用 Git 管理 Perl 模块。 http://www.effectiveperlprogramming.com/2010/02/manage-your-perl-modules-with-git/