如何为不与内置或CPAN软件包名称冲突的自定义Perl模块选择软件包名称?

时间:2009-03-18 16:13:47

标签: perl module naming-conventions cpan

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

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

package Company::Session;

...和Session.pm将在目录Company /.

中找到

但我不是这个命名惯例的粉丝。我宁愿将包层次结构命名为更接近代码的功能。但这就是CPAN一般的做法......

我觉得我错过了一些基本的东西。我也查看了达米安的 Perl最佳实践,但我可能没有找到正确的地方......

有关避免包命名空间冲突的任何建议吗?

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

6 个答案:

答案 0 :(得分:38)

名称空间Local::已被保留用于此目的。 CPAN或核心不接受以该前缀开头的模块。或者,您可以在顶级名称中使用下划线(例如My_Corp::SessionMy_Session)。所有带下划线的类别也已被保留。 (这在perlmodlib中的“为模块选择名称”下提到。)

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

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

Perl如何解决冲突:

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

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

BTW,Perl 6将能够handle multiple modules with the same name by different authors,甚至在一个程序中使用多个。但现在这并没有解决你的问题。

答案 1 :(得分:8)

在公司之后命名内部模块没有任何问题;我总是这样做。 90%的代码最终都是CPAN,因此它具有“普通”名称,但内部资源始终以ClientName::开头。

我相信其他人也会这样做。

答案 2 :(得分:2)

选择一个你喜欢的软件包的名称然后用Google搜索“perl 你选择的名字”会有什么问题?

答案 3 :(得分:2)

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

#!/usr/bin/perl

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

use strict; #error: Can't locate strict.pm in @INC (@INC contains:)

答案 4 :(得分:1)

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

  • 的COM ::例::商务:: FindCustomers
  • 的COM ::例:: IT :: ParseLogs
  • 的COM ::例:: QA :: TESTSERVER

但起初看起来确实很奇怪。

答案 5 :(得分:1)

(我知道这篇文章很老了,但是在过去的几个月里,我不得不对此进行排序,我认为我会权衡一下)

在工作中,我们认为'Local ::'感觉太过地理位置。 CompanyName ::我们也遇到了一些与开发无关的问题,我会跳过这些问题,但我会说,当你需要输入数十次时,CompanyName很长。

所以我们决定'我们的''。当然,我们不是'CPAN Safe',因为有一天我们想要使用带有Our ::前缀的CPAN模块。但感觉还不错。

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

很高兴阅读并且输入很好。