分析CPAN模块的来源我可以看到类似这样的内容:
...
package # hide from PAUSE
Try::Tiny::ScopeGuard;
...
显然,它来自Try::Tiny
,但我在package
关键字和其他模块中的包标识符之间也看到了这种注释。
为什么要使用此程序?它的目标是什么,它有什么好处?
答案 0 :(得分:21)
从PAUSE的索引器中隐藏一个包确实是一个黑客攻击。
将分发上载到PAUSE时,索引器将检查上载中的每个文件,查找分发中包含的软件包的名称。任何索引包都可以显示在CPAN搜索结果中。
不希望索引器发现您的包有很多原因。您的发行版可能包含许多小的或无关紧要的程序包,这些程序包会使模块的搜索结果变得混乱。您可能在t
(测试)目录中定义了包,或者某些其他非标准目录中的包不是作为发行版的一部分安装的。您的发行版可能包含完全不同的文件(其他人写的)。
hack有效,因为索引器严格查找关键字package
以及在同一行上看起来像包名的表达式。
如今,您可以在发布中添加META.yml
个文件。 PAUSE索引器将查找并遵守此文件中的no_index
规范。但这是索引器相对较新的功能,因此较旧的模块和老式CPAN贡献者仍将使用换行黑客。
以下是来自Forks::Super
no_index
规范的示例
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
)。
答案 1 :(得分:-3)
好吧,这是对这种现象的又一次打击......我已经打了几十年的黑客攻击Perl并且我很少看到这种破解,可能只是被忽视而且从不打扰调查。但有一点似乎很清楚。在PAUSE中进行了一些hackish处理,这是在Perl'n'UNIX学院的思想中精心设计的,没有疑问的阴影涉及面向行的文本解析,所以他们解析那些Perl文件,甚至可能使用{{ 1}},而是grep
本身,谁知道,提取包名称,然后踢一些程序或得到一些统计数据或诸如此类的东西。并且为了绊倒这个程序并且破解它的方式,作者将包声明分成两行,所以hacky packy grep作业没有一个线索,声称它的鼻子下方有一个包,程序员对他的hacky技能感到高兴和PAUSE统计数据或它们正在拼凑的任何东西都是应该的。这有意义吗?