我已经阅读了perldoc on modules,但是我没有看到有关命名软件包的建议,因此它不会与内置或CPAN模块/软件包名称冲突。
过去,为了开发本地Session.pm模块,我使用公司的名称创建了本地目录,例如:
package Company::Session;
...和Session.pm将在目录Company /中找到。
但是我只是不喜欢这种命名约定。我宁愿将包层次结构命名为更接近代码的功能。但这通常是在CPAN上完成的方式...
我觉得我缺少基本的东西。我还查看了达米安(Damian)的Perl Best Practices,但可能未在正确的位置查看...
关于避免包名称空间冲突的任何正确建议?
带有相关问题的更新:如果是软件包名称冲突,Perl如何选择要使用的软件包?谢谢大家。
名称空间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
。
顺便说一句,Raku可以handle multiple modules with the same name by different authors,甚至在一个程序中使用多个。这是一个不同的解决方案。
以公司命名您的内部模块没有错;我总是这样做。我90%的代码都以CPAN结尾,因此具有“常规”名称,但内部填充始终以ClientName::
开头。
我确定其他所有人也都这样做。
仅为您喜欢的软件包选择一个名称然后搜索“ perl 您所选择的名称”是什么意思?]
@INC
变量包含要在其中查找模块的目录列表。它从第一个条目开始,如果找不到请求模块,则移至下一个条目。 @INC
具有在编译perl时创建的默认值,但是您可以使用PERL5LIB
环境变量PERL5LIB
进行更改,并直接在lib
pragma块中操作lib
数组:
@INC
如果需要最大程度的确定性,即您的模块名称不会与其他人的模块冲突,则可以从Java的书中浏览一个页面:使用公司域的名称来命名模块。因此,如果您为Example,Inc.工作,其域名为example.com,则应将HTML解析器模块命名为Com :: Example :: HTML :: Parser或Example :: Com :: HTML :: Parser。第一个的好处是,如果您有多个子单元,它们都可以具有自己的名称空间,但是模块仍将排序在一起:
但是起初看起来确实很奇怪。
((我知道这篇文章很旧,但是由于过去几个月来我不得不对此进行梳理,所以我认为自己应该考虑一下)]
[在工作中,我们认为'Local ::'感觉太过地理。 CompanyName ::也给我们带来了一些与开发无关的问题,我将跳过这些问题,尽管当您不得不键入数十次时,我会说CompanyName很长。
所以我们决定使用'Our ::'。当然,我们不是“ CPAN安全”用户,因为有时候可能要使用带有Our ::前缀的CPAN模块。但这感觉很好。
[Our :: Data是我们的Class :: DBI模块Our :: App是我们的通用应用程序框架,可进行配置处理和Getopt内容
阅读不错,打字也很不错。