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