28

我已经阅读了有关 modules 的 perldoc,但我没有看到关于命名包的建议,因此它不会与内置或 CPAN 模块/包名称冲突。

过去,为了开发本地的Session.pm模块,我用我公司的名字创建了一个本地目录,例如:

package Company::Session;

...和 ​​Session.pm 将在目录 Company/ 中找到。

但我只是不喜欢这种命名约定。我宁愿将包层次结构命名为更接近代码的功能。但这通常是在 CPAN 上完成的......

我觉得我错过了一些基本的东西。我还查看了 Damian 的Perl 最佳实践,但我可能没有找对地方......

关于以正确的方式避免包命名空间冲突的任何建议?

更新 w/ 相关问题:如果存在名冲突,Perl 如何选择使用哪一个?谢谢大家。

4

6 回答 6

39

命名空间Local::已为此目的而保留。CPAN 或核心不会接受以该前缀开头的任何模块。或者,您可以在顶级名称中使用下划线(likeMy_Corp::Session或 just My_Session)。所有带下划线的类别也已保留。(这在perlmodlib中提到,在“为模块选择名称”下。)

请注意,这两个保留仅适用于顶级名称。例如,有名为Time::Local和的 CPAN 模块Text::CSV_XS。但是Local::TimeText_CSV::XS是保留名称,不会在 CPAN 上被接受。

在您的公司之后命名模块也可以。(好吧,除非你为一些听起来很普通的公司工作。)使用反向域名可能是矫枉过正,除非你打算将你的模块分发给其他人。(但在这种情况下,您可能应该注册一个普通的模块名称。)

Perl 如何解决冲突:

Perl 在目录中搜索@INC具有指定名称的模块。找到的第一个模块就是使用的模块。因此,目录的顺序@INC决定了将使用哪个模块(如果您在不同的位置安装了同名的模块)。

perl -V将报告@INC(优先级最高的目录首先列出)的内容。但是也有很多方法可以@INC在运行时进行操作。

顺便说一句,Raku 可以处理不同作者的多个同名模块,甚至可以在单个程序中使用多个模块。那是一个不同的解决方案。

于 2009-03-18T17:05:52.923 回答
8

以公司名称命名内部模块并没有错;我总是这样做。我的 90% 的代码最终都在 CPAN 上,所以它有“正常”的名称,但内部的东西总是以ClientName::.

我相信其他人也这样做。

于 2009-03-18T16:44:22.850 回答
2

只为您喜欢的包选择一个名称然后在谷歌上搜索“perl the-name-you-picked ”有什么问题?

于 2009-03-18T16:25:29.963 回答
2

@INC变量包含要在其中查找模块的目录列表。它从第一个条目开始,如果没有找到请求模块,则转到下一个条目。 @INC具有编译 perl 时创建的默认值,但您可以使用PERL5LIB环境变量libpragma更改它,并直接在块中操作@INC数组:BEGIN

#!/usr/bin/perl

BEGIN {
    @INC = (); #no modules can be found
}

use strict; #error: Can't locate strict.pm in @INC (@INC contains:)
于 2009-04-02T12:29:02.367 回答
1

如果您需要最大程度地确定您的模块名称不会与其他人的名称冲突,您可以从 Java 的书中获取一页:用公司域的名称命名模块。因此,如果您为 Example, Inc. 工作,并且他们的域名是 example.com,您可以将 HTML 解析器模块命名为 Com::Example::HTML::Parser 或 Example::Com::HTML::Parser。第一个的好处是,如果您有多个子单元,它们都可以有自己的名称空间,但模块仍然会一起排序:

  • Com::Example::Biz::FindCustomers
  • Com::Example::IT::ParseLogs
  • Com::Example::QA::TestServer

但乍一看确实很奇怪。

于 2009-03-18T16:36:41.277 回答
1

(我知道这篇文章已经过时了,但由于过去几个月我不得不解决这个问题,我想我会权衡一下)

在工作中,我们认为“Local::”感觉过于地域化。CompanyName:: 对我们来说也有一些与开发无关的问题,我会跳过这些,虽然我会说 CompanyName 很长,因为你必须输入几十次。

所以我们选择了'Our::'。当然,我们不是“CPAN 安全”的,因为可能有一天我们想使用带有 Our:: 前缀的 CPAN 模块。不过感觉不错。

Our::Data 是我们的 Class::DBI 模块 Our::App 是我们的通用应用程序框架,它执行配置处理和 Getopt 内容

读起来很舒服,打字也很好。

于 2009-04-02T12:09:10.213 回答