1

我正在研究如何打包我的一些 Perl 应用程序并更好地管理它们的依赖项,以使我和我的客户更容易分发,这很可能根本不包括上传到 CPAN。相反,如果有必要,我会提供自定义 repos,或者更有可能的是访问像 Subversion 这样的 SCM。

CPAN::Meta::Spec似乎提供了我需要描述我的应用程序、它们的依赖关系甚至从何处获取它们的内容,但我想知道的是先决条件的详细程度。该规范包含以下句子:

必须将关系集指定为包名称到版本范围的映射。

对我的需求来说,要求包似乎有点太低了,我宁愿要求发行版。像 Maven 和 Gradle 这样的级别(根据我的理解)工具几乎可以工作,例如 Apache Commons Lang 与 Apache Commons IO 等,而不是像org.apache.commons.lang3.AnnotationUtilsor之类的单个类org.apache.commons.io.ByteOrderMark。OTOH,文档中的示例包含以下几行:

requires => {
  'perl'          => '5.006',
  'File::Spec'    => '0.86',
  'JSON'          => '2.16',
},

包含的行perl对我来说看起来不像一个包,我没有在我的系统上找到一些package perl或任何地方。perl.pm在我看来,这与示例中的其他事情的处理方式不同。

我有一个系统范围的文件夹,其中包含例如一些实用程序包,这对我来说似乎与一些抽象相当perl。该文件夹应该被定义为一个发行版,为该文件夹中的所有包维护一个版本号,因此应该允许其他应用程序访问require整个内容。如果我正确理解文档,我不仅需要META.yml在文件夹中创建,还需要创建一些,例如sysutils.pm包含package sysutils;和定义一些版本。

有什么方法可以避免创建该文件,而实际上require只创建发行版本身?

META.yml本身已经包含一个名称和版本,所以看起来像一些require理论上可以抽象的东西。我不认为需要添加一个额外的.pm-file 代表分发本身只是为了允许require工作。在我的情况下,它不包含任何业务逻辑。

谢谢!

4

2 回答 2

3

这真的不是你想做的。你想预先请求你实际需要的东西。因此,例如,如果您需要File::Spec,这就是您所需要的,无论它来自 perl 核心还是来自单独的 CPAN 发行版。

我见过某些模块从 CPAN 转移到核心的案例,反之亦然。通过直接要求该模块,您不需要仅仅因为您依赖的某个人更改了他们的分发方法而发布您的依赖发行版的新版本。

我还看到某些模块在确定它们作为独立模块有价值时从其原始发行版中分离出来的情况。依赖模块意味着您不再为了简单的依赖而拖入一堆其他模块。

您或多或少地寻找类似于Task::*模块的东西。其中大多数没有真正的逻辑,只是进一步依赖的列表。

于 2019-02-01T17:20:38.963 回答
0

Perl 依赖系统完全适用于包名称,在多个级别上。上传 CPAN 发行版时,其中的每个包都由 PAUSE 索引,它还会检查上传者是否具有该包的权限,以及该包是否具有比当前索引包更新的版本。这些检查都不关心整个分布(尽管索引器会在该级别进行其他检查)。

然后,当 CPAN 客户端看到依赖项,或者您告诉它安装某些东西时,它会检查该包名称的索引,这会告诉它要安装哪个发行版。如果它依赖于某个版本,$VERSION如果您安装了它,则会根据该包中的声明进行检查;而一旦安装了一个发行版,它的“版本”就不再被跟踪了。分发级别几乎完全没有意义,只是它最终是为了满足这些依赖而下载和安装的。这很重要,因为模块可以并且确实在发行版之间移动,维护它们的版本增量,并且包索引将始终告诉您哪个发行版可以获得您需要的版本。

正如您所注意到的,perl依赖性很奇怪。这是一个一直存在的特殊情况,作为声明您需要的 Perl 版本的约定,您声明运行时要求为perl. 它不是一个索引模块,每个 CPAN 客户端和 CPAN 元数据的其他消费者在特殊情况下要么忽略它,要么将其视为最低 Perl 版本,而不是可以安装的东西。没有办法将其扩展到一般的发行版中,尝试这样做是个坏主意。

作为附加说明,CPAN 元规范是META.jsonCPAN 发行版中包含的文件的规范(META.yml是旧版本),但该文件是由您的创作工具自动生成的。它永远不应该手动创建,尽管您可以让您的创作工具手动添加某些键(在这种情况下阅读规范很重要),包括prereqs. 请参阅neilb 的博客文章,了解如何为各种创作工具指定依赖项,然后将它们转换为生成的 META 文件,以及如何使用 cpanfiles 指定一般的依赖项。

于 2019-02-01T21:43:01.820 回答