在使用包管理器时,您如何管理Perl模块?
这里最近的一个问题让我思考。
在我尝试的大多数Linux发行版中,通过软件包管理器可以使用一些Perl模块。 其他人当然不是。 在我需要安装一些CPAN模块来确定软件包是否可用以及是否安装它时,我会使用我的软件包管理器很长一段时间。
显而易见的好处是,只要有新版本的软件包可用,就可以更新模块。
但是,如果模块不能以预封装格式提供,并且该模块存在依赖关系,则会遇到麻烦。 每次cpan shell询问它是否应该遵循依赖关系时,打包你的包管理器会非常累人。
通常,另一个缺点是预封装模块的版本。 如果您正在运行Debian或Ubuntu,您很快就会发现,您将无法生活在流血的边缘,就像许多CPAN模块作者似乎所做的那样。
Linux上的其他Perl人员如何处理这个问题? 你只是忽略你的软件包管理者必须提供什么? 是否有任何工具可以帮助(例如)和更好的队友? 或者你只是不通过cpan外壳安装任何东西?
由于这个问题最初被问到,perlbrew已经发布。 它使得安装自定义的,独立的perl安装变得微不足道。 而在这些版本之间切换也很简单:
perlbrew switch $version
为了开发,我安装了我自己的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-threaded)。 当我想要一个特定的版本时,我只使用我想要的版本:
$ 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 "ttlinking $bin => $link";
symlink $bin => $link or
warn "ttCould not create symlink [$!]: $bin => $link!";
}
}
所有东西都安装在特定Perl的正确位置。
我也一直在想,我应该把这些Perl目录放在某种源代码控制之下。 如果我添加一个我不喜欢的模块,我只是退回到以前的版本。 我只是开始这样做,并没有玩得太多。
我在Effective Perler博客上写了更多关于这种事情的文章:
我们通过CPAN shell安装所有东西。 这确实忽略了软件包管理者必须提供的功能,但是它避免了在尝试使用它们时所提到的令人头疼的问题(使用正确版本解决依赖性问题)。
此外,这意味着我们的软件包可以在CPAN运行的任何平台上以编程方式构建(或通过shell手动构建)。 依赖于软件包管理器会影响您将软件分发到不使用/支持软件包管理器的平台的能力。
链接地址: http://www.djcxy.com/p/19061.html上一篇: How do YOU manage Perl modules when using a package manager?
下一篇: Keyboard shortcuts are not active in Visual Studio with Resharper installed