Mar*_*cus 28 perl cpan module naming-conventions
我已经阅读了模块上的perldoc,但是我没有看到有关命名包的建议,因此它不会与内置或CPAN模块/包名冲突.
过去,为了开发本地Session.pm模块,我使用我公司的名称创建了一个本地目录,例如:
package Company::Session;
Run Code Online (Sandbox Code Playgroud)
...和Session.pm可以在目录Company /中找到.
但我不是这个命名惯例的粉丝.我宁愿将包层次结构命名为更接近代码的功能.但这就是CPAN一般的做法......
我觉得我错过了一些基本的东西.我也看过达米安的Perl最佳实践,但我可能没有找到正确的地方......
有关避免包命名空间冲突的任何建议吗?
更新W /相关的问题:如果是一个包名称冲突,如何Perl的选择使用哪一个?感谢大家.
cjm*_*cjm 39
该命名空间Local::仅用于此目的.CPAN或核心不接受以该前缀开头的模块.或者,您可以在顶级名称中使用下划线(My_Corp::Session或者只是My_Session).所有带下划线的类别也已被保留.(这在perlmodlib中提到,在"为模块选择一个名称"下.)
请注意,这两个保留仅适用于顶级名称.例如,有CPAN模块命名Time::Local和Text::CSV_XS.但是Local::Time并且Text_CSV::XS是保留名称,不会在CPAN上接受.
贵公司也很好的命名模块.(好吧,除非你为一些非常通用的声音公司工作.)使用反向域名可能有点过分,除非你打算将你的模块分发给其他人.(但在这种情况下,您应该注册一个正常的模块名称.)
Perl如何解决冲突:
Perl在目录中搜索@INC具有指定名称的模块.找到的第一个模块是使用的模块.因此,目录的顺序@INC决定了将使用哪个模块(如果您在不同位置安装了具有相同名称的模块).
perl -V将报告@INC(首先列出最高优先级目录)的内容.但是也有很多方法可以@INC在运行时进行操作.
顺便说一下,Perl 6将能够处理不同作者使用相同名称的多个模块,甚至可以在一个程序中使用多个模块.但这并不能解决你现在的问题.
在贵公司之后命名内部模块没有任何问题; 我总是这样做.90%的代码最终都是CPAN,所以它有"普通"的名字,但内部的东西总是以ClientName::.
我相信其他人也会这样做.