使用包管理器时如何管理 Perl 模块?

2024-06-19

A 最近的问题 https://stackoverflow.com/questions/397817/unable-to-find-perl-modules-in-intrepid-ibex-ubuntu这让我开始思考。

在我尝试过的大多数 Linux 发行版上,一些 Perl 模块可以通过包管理器使用。当然,其他人则不然。很长一段时间,每当我需要安装一些 CPAN 模块来查明某个包是否可用并在可用时安装它时,我都会使用包管理器。

明显的优点是,只要有新版本的软件包可用,您就可以更新模块。

但是,当模块不以预打包形式提供并且该模块存在依赖项时,您就会遇到麻烦。每次 cpan shell 询问它是否应该遵循依赖项时启动包管理器可能会非常累人。

通常,另一个缺点是预打包模块的版本。如果您运行的是 Debian 或 Ubuntu,您很快就会发现您将无法生活在最前沿,就像许多 CPAN 模块作者所做的那样。

Linux 上的其他 Perl 用户如何处理这个问题?您是否只是忽略了包管理器必须提供的内容?是否有任何工具可以使 apt(例如)和 cpan 成为更好的队友?或者您根本不通过 cpan shell 安装任何东西?


为了进行开发,我安装了自己的 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/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用包管理器时如何管理 Perl 模块? 的相关文章

  • Symfony 权限被拒绝

    谁能帮我解决我收到的以下错误消息 我终于在虚拟机上安装了 Symfony 它似乎工作正常 除了我偶尔收到这样的消息 1 2 ContextErrorException Warning SessionHandler read open var
  • 如何从存储在 char* 指针中的 name 调用 c 函数?

    我想通过函数的名称动态调用函数 例如 假设有以下函数和字符串 void do fork printf Fork called n char pFunc do fork 现在我需要打电话do fork 就在 pFunc 那么这可能吗 欢迎 C
  • 通过匹配模式将字符串替换为另一个文本文件中的行

    我有一个带有对应键 gt 值的文件 sort keyFile txt head ENSMUSG00000000001 ENSMUSG00000000001 Gnai3 ENSMUSG00000000003 ENSMUSG0000000000
  • 为什么安装某些 CPAN 模块需要 root 权限?

    我需要在没有 root 权限的 Linux 机器上安装一些 CPAN 模块 安装Spreadsheet WriteExcel http search cpan org perldoc Spreadsheet WriteExcel进行得很顺利
  • File::Find 是否有更干净的方法来返回所需文件的列表?

    我找到了背后的设计选择File Find find https metacpan org module File 3a 3aFind有点令人惊讶 我遇到过的例子都表明find用在 void 上下文中 The 文档 https metacpa
  • 如何在 Perl 中不阻塞地测试 STDIN?

    我正在编写我的第一个 Perl 应用程序 一个 AOL Instant Messenger 机器人 它与 Arduino 微控制器对话 后者控制一个伺服系统 按下我们系统管理员服务器上的电源按钮 该服务器每 28 小时左右就会随机冻结一次
  • 很好的 C 库集合? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个很好的 ANSI C 库集合 用于处理向量 哈希映射 二进制树 字符串处理等 Try g
  • 如何使用org.apache.commons包?

    在各种网络示例中 我看到了导入 例如 import org apache commons net ftp FTPClient 我不明白如何使用这些 而且 apache 网站也相当不清楚 我该如何使用这些类 我希望我需要下载一些东西 但如果有
  • 为什么我不能用这个循环从 bash 历史记录中删除多个条目

    这个循环将显示我想要做的事情 但是如果我删除echo从中 它实际上不会删除任何内容 history grep 0 5 0 9 ls cut c1 5 while read id do echo history d id done 我添加了缩
  • 我应该如何从非 root Debian Linux 守护进程登录?

    我正在编写一个新的守护进程 它将托管在 Debian Linux 上 我发现 var log 具有仅 root 写入权限 因此我的守护进程无法在那里写入日志文件 但是 如果它写入那里 它似乎将获得自动日志轮转 并且也按照用户期望的方式工作
  • 参数无效”设置键“net.core.somaxconn”

    我尝试设置Linux内核 编辑后 etc sysctl conf并执行sysctl p它显示错误 Invalid argument setting key net core somaxconn Linux 发行版 Ubuntu 12 04
  • 获取所有 JVM 使用的所有 Java 类的列表?

    我想要一个在某个时刻在多个线程 JVM 中加载的所有类的列表 我知道当你运行java时 verbose参数 您可以将其写入文件 如下所示 java verbose class com package Foo gt classes used
  • 如何在每个 xargs 命令之间休眠 1 秒?

    例如 如果我执行 ps aux awk print 1 xargs I echo 我想让 shell 在每次之间休眠 1 秒echo 如何更改我的 shell 命令 您可以使用以下语法 ps aux awk print 1 xargs I
  • Linux 是否允许从信号处理程序进行任何系统调用?

    我的理解是 一般来说 如果您从信号处理程序调用非异步信号安全函数 则行为是未定义的 但我听说 Linux 允许您安全地调用任何系统调用 这是真的 另外 SIGSEGV 处理程序的唯一可移植行为是中止或退出 但我知道如果返回 linux 实际
  • Python select() 行为很奇怪

    我在理解 select select 的行为时遇到一些困难 请考虑以下 Python 程序 def str to hex s def dig n if n gt 9 return chr 65 10 n else return chr 48
  • c - 后台运行的程序的退出状态

    我有一个任务 其中我必须创建一个迷你 shell 它能够执行很多操作 包括作业控制 我设法使用 fork 和 execvp 创建新的工作 但我还想获取 execvp 运行的程序的退出代码 根据我从其他帖子中查找到的内容 我可以使用以下方法来
  • Zip 实用程序在 Linux 中每次都给我不同的 md5sum

    当我在 Linux 中压缩 Zip 2 31 同一个文件时 每次都会得到不同的校验和 如何保持上次的 md5sum 相同 我正在使用 yum 提供的最新 zip 更新 生成的存档不仅包含压缩文件数据 还包含 额外的文件属性 如参考zip 文
  • 强制 shell 在 SunGrid 引擎中使用 conda 变量中的 python [重复]

    这个问题在这里已经有答案了 我正在尝试在 SunGrid 引擎中执行 python 文件 并且从 anaconda3 环境变量中执行它 我的代码很简单 from future import print function import url
  • JS 导入模块并在页面加载时运行

    我想使用 html onload 事件和从另一个 generateObject js 文件导入的 console log 文本来调用我的函数 main 但是当我导入函数时 onload 事件停止工作并且函数 main 不再使用 html 生
  • 无法声明接口:资源繁忙

    我正在使用 USB4Java 低级版本 并且基本上是根据这段代码工作的here http www mets blog com java usb communication usb4java 我在 Ubuntu 中工作 遇到了有关权限的问题

随机推荐