12

分析 CPAN 模块的来源,我可以看到如下内容:

...
package # hide from PAUSE
   Try::Tiny::ScopeGuard;
...

显然,它取自,但我在其他模块中也看到过关键字和包标识符 之间Try::Tiny的这种注释。package

为什么使用这个程序?它的目标是什么,它有什么好处?

4

2 回答 2

22

从 PAUSE 的索引器中隐藏一个包确实是一种 hack。

当分发上传到 PAUSE 时,索引器将检查上传中的每个文件,查找包含在分发中的包的名称。任何被索引的包都可以显示在 CPAN 搜索结果中。

不希望索引器发现您的包的原因有很多。您的发行版可能有许多小的或无关紧要的软件包,它们会使您的模块的搜索结果变得混乱。您可能在t(test) 目录或其他一些非标准目录中定义了包,这些包不打算作为分发的一部分安装。您的发行版可能包含来自完全不同的发行版(其他人编写的)的文件。

hack 之所以有效,是因为索引器package在同一行严格查找关键字和看起来像包名称的表达式。

现在,您可以META.yml在您的发行版中包含一个文件。PAUSE 索引器将查找并遵守no_index此文件中的规范。但这是索引器的一项相对较新的功能,因此旧模块和旧 CPAN 贡献者仍将使用换行破解。

no_index这是来自的规范示例Forks::Super

no_index:
    directory:
        - t
        - inc
    package:
        - Sys::CpuAffinity
        - Signals::XSIG
        - Signals::XSIG::Default
        - Signals::XSIG::TieArray56

Sys::CpuAffinity并且Signals::XSIG是单独的发行版,也与Forks::Super. 一些测试脚本包含不应被索引的package声明(例如, )。Arbitrary::Test::Package

于 2012-06-06T21:15:12.917 回答
-3

好的,这是关于这种现象的另一个镜头……我已经对 Perl 进行了十几年的黑客攻击,而且我很少看到这种打包的 hack,可能只是被忽略了,也从不费心去调查。不过,有一件事似乎很清楚。在 PAUSE 进行了一些骇人听闻的处理,这些处理是在良好的 ol'Perl'n'UNIX 学派中精心设计的,毫无疑问涉及面向行的文本解析,因此他们解析这些 Perl 文件,甚至可能使用grep, 但是相当perl本身,谁知道,提取包名称,然后启动一些程序或获取一些统计信息或诸如此类的东西。为了绕过这个过程并破解它的方式,作者将包声明分成两行,所以hacky packy grep 工作不知道在它的鼻子下声明了一个包并且程序员对他的hacky技能感到高兴并且 PAUSE 统计数据或他们正在拼凑的任何东西都是应有的。那有意义吗?

于 2012-06-06T21:14:01.713 回答