在使用包管理器时,您如何管理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博客上写了更多关于这种事情的文章:

  • 建立每个版本工具的链接。
  • 用Git管理你的Perl模块。

  • 我们通过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