分析CPAN模块的来源我可以看到这样的事情:
...
package # hide from PAUSE
Try::Tiny::ScopeGuard;
...
Run Code Online (Sandbox Code Playgroud)
显然,它取自Try::Tiny,但我也看到了其他模块中关键字和包标识符之间的这种评论package.
为什么使用此程序?它的目标是什么,它有什么好处?
mob*_*mob 21
从PAUSE的索引器中隐藏一个包确实是一个黑客攻击.
将分发上载到PAUSE时,索引器将检查上载中的每个文件,查找分发中包含的软件包的名称.任何索引包都可以显示在CPAN搜索结果中.
不希望索引器发现您的包有很多原因.您的发行版可能包含许多小的或无关紧要的程序包,这些程序包会使模块的搜索结果变得混乱.您可能在t(测试)目录中定义了包,或者某些其他非标准目录中的包不是作为发行版的一部分安装的.您的发行版可能包含来自完全不同的发行版的文件(其他人写的).
该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
Run Code Online (Sandbox Code Playgroud)
Sys::CpuAffinity并且Signals::XSIG是与之一起打包的单独发行版Forks::Super.某些测试脚本包含不应编入索引的package声明(例如Arbitrary::Test::Package).