我已阅读perldoc on modules,但我没有看到有关命名包的建议,因此它不会与内置或CPAN模块/包名冲突。
过去,为了开发本地Session.pm模块,我使用我公司的名称创建了一个本地目录,例如:
package Company::Session;
...和Session.pm将在目录Company /.
中找到但我不是这个命名惯例的粉丝。我宁愿将包层次结构命名为更接近代码的功能。但这就是CPAN一般的做法......
我觉得我错过了一些基本的东西。我也查看了达米安的 Perl最佳实践,但我可能没有找到正确的地方......
有关避免包命名空间冲突的任何建议吗?
更新w /相关问题:如果 包名称冲突,Perl如何选择使用哪一个?谢谢大家。
答案 0 :(得分:38)
名称空间Local::
已被保留用于此目的。 CPAN或核心不接受以该前缀开头的模块。或者,您可以在顶级名称中使用下划线(例如My_Corp::Session
或My_Session
)。所有带下划线的类别也已被保留。 (这在perlmodlib中的“为模块选择名称”下提到。)
请注意,这两个预订仅适用于顶级名称。例如,有名为Time::Local
和Text::CSV_XS
的CPAN模块。但Local::Time
和Text_CSV::XS
是保留名称,不会在CPAN上接受。
在公司也很好之后命名模块。 (好吧,除非你为一些非常通用的声音公司工作。)使用反向域名可能有点过分,除非你打算将你的模块分发给其他人。 (但在这种情况下,您应该注册一个正常的模块名称。)
Perl如何解决冲突:
Perl在@INC
中的目录中搜索具有指定名称的模块。找到的第一个模块是使用的模块。因此@INC
中目录的顺序决定了将使用哪个模块(如果在不同位置安装了具有相同名称的模块)。
perl -V
将报告@INC
的内容(首先列出最高优先级目录)。但是有很多方法可以在运行时操作@INC
。
答案 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。第一个好处是,如果你有多个子单元,他们都可以拥有自己的名称空间,但模块仍然可以排在一起:
但起初看起来确实很奇怪。
答案 5 :(得分:1)
(我知道这篇文章很老了,但是在过去的几个月里,我不得不对此进行排序,我认为我会权衡一下)
在工作中,我们认为'Local ::'感觉太过地理位置。 CompanyName ::我们也遇到了一些与开发无关的问题,我会跳过这些问题,但我会说,当你需要输入数十次时,CompanyName很长。
所以我们决定'我们的''。当然,我们不是'CPAN Safe',因为有一天我们想要使用带有Our ::前缀的CPAN模块。但感觉还不错。
我们的:: Data是我们的Class :: DBI模块 我们的:: App是我们的通用应用程序框架,它执行配置处理和Getopt东西
很高兴阅读并且输入很好。