【问题标题】:How to tell CPAN (Perl) about packages created with meta-programming?如何告诉 CPAN (Perl) 使用元编程创建的包?
【发布时间】:2011-05-18 02:11:59
【问题描述】:

我有几个 CPAN 模块,它们广泛使用元编程来减少样板文件并简化重构。

然而,这样做的结果是有许多包是通过编程方式创建的,因此源代码中永远不会有 package X::Y::Z; 行供 CPAN 查找(然后用于将命名空间添加到您的先到者列表保留命名空间)。

所以我的问题是,是否有让 CPAN 了解这些运行时创建的包的首选方式。以下是我目前正在考虑的选项:

  • 手动搜索所有包并创建一个虚拟的pm 文件供 CPAN 索引。
  • 手动搜索然后更新 Build.PL 以将它们包含在 provides 列表中。
  • 在元编程例程中添加一些代码以跟踪使用了哪些包,并在build dist 中添加挂钩以更新providesMETA.yaml 的其他部分

我目前倾向于最后一个选项。我想知道这种方法是否有任何问题,或者有什么更好的方法可以让 CPAN 更新为完整的软件包列表。

【问题讨论】:

    标签: perl metaprogramming cpan


    【解决方案1】:

    如果我没看错的话,这不是问题,只要您不破坏其他命名空间。没有先决条件来声明创建的每个命名空间,只有你的发行版的基本命名空间和与发行版关联的文件。如果您想“保留”某些命名空间,而不是创建空白 .pm 文件,请查看创建 .pod 文件和文档。

    【讨论】:

    • 至少在我最严重的违规者List::Gen 的情况下,运行时创建的包都不包含最终用户应该直接调用的任何函数。因此,为他们提供最终用户文档并没有什么意义。我知道没有必要声明所有包名称,但我认为让 PAUSE 知道它们是“最佳”做法。
    • 所有 PAUSE 关心的是适当的文件(META.yml/.json、MANIFEST 等)是否存在并且格式正确。一旦你有了一个命名空间,你在其中做什么是你的事,而不是其他人,除非他们在你的命名空间中有贡献的权限。只要您在文档中解释命名空间是自动生成的,您就已经完成了自己的工作。
    • => 你确定吗?根据 brian d foy 的博客文章 (effectiveperlprogramming.com/blog/884):当 PAUSE 为您分配一个命名空间作为主要维护者时,您只“拥有”该命名空间。尽管 Perl 名称空间看起来是分层的,但实际上并非如此。也就是说,Perl 中没有任何东西关心您使用的命名空间或您的包继承自哪个命名空间。 XML::Simple 命名空间不会因其名称而从 XML 继承。同样的,你对 Foo::Bar::Baz 没有任何权限,仅仅是因为 PAUSE 为你分配了对 Foo::Bar 的权限。
    猜你喜欢
    • 1970-01-01
    • 2010-11-12
    • 2012-10-11
    • 2018-04-12
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多