【问题标题】:How to handle external dependencies in perl's ExtUtils:MakeMaker如何在 perl 的 ExtUtils:MakeMaker 中处理外部依赖项
【发布时间】:2014-06-08 17:50:22
【问题描述】:

我有一系列 perl 脚本,我正在为此编写一个 Makefile.PL 脚本,但我对 ExtUtils::MakeMaker 相当缺乏经验。

我编写的其中一个脚本对必须安装的命令行实用程序进行系统调用,以便脚本正常运行。我的脚本可以优雅地检测到该实用程序丢失并发出有关安装它并将其放入用户路径的错误,但是在 Makefile.PL 脚本中是否有一些标准方法来处理这个问题?如果我在 Makefile.PL 脚本中输入下载链接,它甚至会 gasp 尝试安装第三方实用程序吗?

至少,我希望脚本在未找到外部依赖项时警告用户。我知道我可以编写一个使用它的测试用例。这是否像复制和粘贴我在脚本本身中编写的检查第三方实用程序并在未找到时打印错误的子例程一样简单,或者这是“错误的方法”?

【问题讨论】:

  • 您需要什么实用程序?由于 perl 是独立于平台的,因此如果您打算将它添加到 CPAN,它需要在所有平台上都有该实用程序。另一方面,可能已经有该实用程序的 perl 实现,然后您可以将其添加为模块依赖项
  • 该实用程序是一个命令行实用程序,它具有适用于大多数系统的二进制文件。它是一种用于 DNA 和蛋白质序列的多序列比对器,称为肌肉 (drive5.com/muscle/downloads.htm)。我使用 IPC::Open3 从我的脚本中调用它。在不知道是否有检查此类命令行依赖项的标准方法的情况下,我只是在 Makefile.PL 中创建了一个子程序来检查它并在它不在用户路径中时发出警告。

标签: perl makefile dependencies external


【解决方案1】:

如果您对命令行实用程序有外部依赖(即没有执行该实用程序的 perl 模块),ExtUtils::MakeMaker 并非旨在处理这种依赖关系。您需要做的是编写安装脚本或编辑 make 文件来处理依赖关系。以下是这样做的注意事项:

  1. 检查依赖是否存在,版本是否足够。
  2. 下载依赖包
  3. 配置、编译和安装依赖包
  4. 测试以确保其正常工作
  5. 如有必要,更新用户的环境设置
  6. 运行 perl 包的安装步骤(例如 perl makefile.PL;make;sudo make install)

注意,您可能需要知道您的脚本是否以 root 身份运行,您可以使用id -u 来验证用户 ID 是否为 root(即“0”)。

【讨论】:

  • 顺便说一句,我提交了这个答案,因为没有其他人提供解决方案。这基本上就是我最终完成它的方式,并且它在多个系统上运行良好,尽管每个系统都有一些怪癖需要克服。我没有详细介绍。如果有人提供更好的解决方案,我会切换首选答案。
【解决方案2】:

为了争论,我们称这个外部依赖为foobar

根据@KeepCalmAndCarryOn 的评论,首先考虑是否可以将foobar 替换为CPAN 中的某些内容(可能是Foo::Bar),或者几行Perl。

否则,最好的做法是:

  1. 创建一个名为 Alien::Foobar 的新 CPAN 分发。 Alien::Foobar 的工作是下载,也许是编译,然后安装 foobar,作为 Alien::Foobar 的 Makefile.PL 或 Build.PL 的一部分。

    (存在一个名为 Alien::Base 的模块,旨在使此类事情变得更容易。它主要用于安装库而不是二进制文件,尽管我在后者中使用它取得了一些成功。)

  2. 现在您最初处理的 Makefile.PL 可以声明对 Alien::Foobar 的依赖。

【讨论】:

  • 那么没有传统的方法来处理第 3 方命令行可执行依赖项吗?我刚刚完成了一个处理依赖项安装的 shell 安装脚本。本质上,它只是一个 curl、tar、chmod、cp、&ln;但我需要担心他们想要安装它的位置,是否以 root 身份安装,是否存在这些命令,是否附加到用户的环境脚本等。这是我第一次尝试这样的脚本。有更简单的方法吗?
猜你喜欢
  • 2019-08-13
  • 1970-01-01
  • 2021-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-11
  • 2010-11-15
  • 1970-01-01
相关资源
最近更新 更多