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

问题描述 投票:28回答:6

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

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

package Company::Session;

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

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

我觉得我缺少基本的东西。我还查看了达米安(Damian)的Perl Best Practices,但可能未在正确的位置查看...

关于避免包名称空间冲突的任何正确建议?

带有相关问题的更新:如果软件包名称冲突,Perl如何选择要使用的软件包?谢谢大家。

perl module naming-conventions cpan
6个回答
39
投票

名称空间Local::已被保留用于此目的。以该前缀开头的模块将不会被CPAN或核心所接受。另外,您可以在顶级名称中使用下划线(例如My_Corp::Session或仅使用My_Session)。带有下划线的所有类别也已保留。 (在perlmodlib中的“选择模块名称”下对此进行了提及。)

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

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

Perl如何解决冲突:

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

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

顺便说一句,Raku可以handle multiple modules with the same name by different authors,甚至在一个程序中使用多个。这是一个不同的解决方案。


8
投票

以公司命名您的内部模块没有错;我总是这样做。我90%的代码都以CPAN结尾,因此具有“常规”名称,但内部填充始终以ClientName::开头。

我确定其他所有人也都这样做。


2
投票

仅为您喜欢的软件包选择一个名称然后搜索“ perl 您所选择的名称”是什么意思?]


2
投票

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

@INC

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

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


1
投票

((我知道这篇文章很旧,但是由于过去几个月来我不得不对此进行梳理,所以我认为自己应该考虑一下)]

[在工作中,我们认为'Local ::'感觉太过地理。 CompanyName ::也给我们带来了一些与开发无关的问题,我将跳过这些问题,尽管当您不得不键入数十次时,我会说CompanyName很长。

所以我们决定使用'Our ::'。当然,我们不是“ CPAN安全”用户,因为有时候可能要使用带有Our ::前缀的CPAN模块。但这感觉很好。

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

阅读不错,打字也很不错。

© www.soinside.com 2019 - 2024. All rights reserved.