2009-09-14 25 views
1

我目前正在使用PAR Packer(pp)打包几个pl脚本,这样他们就可以复制到一台机器上,并且“正常工作”,而不必让我的客户端与CPAN混淆。PAR包装器可以生成独立的脚本吗?

不幸的是,PAR包装器不适用于深度依赖性。例如,一个脚本导入CHI :: Driver :: File,但不显式导入CHI :: Driver :: File所需的Log :: Any :: Adapter :: Null。 PAR不拿起这种依赖和运行生成的脚本将以下错误消息崩溃:

Can't locate Log/Any/Adapter/Null.pm in @INC (@INC contains: CODE(0x874aab8) /tmp/par-apache/cache-7b4508ab92efb43271da1629e8eb654c1572cc55/inc/lib /tmp/par-apache/cache-7b4508ab92efb43271da1629e8eb654c1572cc55/inc CODE(0x87e8f54) CODE(0x87e9194)) at (eval 215) line 3. 
Compilation failed in require at CHI/Driver/File.pm line 11. 
BEGIN failed--compilation aborted at CHI/Driver/File.pm line 11. 

我的解决办法是明确地导入“登录::任何::适配器::空”但必须有是更好的方法。也许这是PAR Packer的一个错误?我已安装最新版本(0.994)。

+3

描述您使用哪些命令行选项来构建包。 – 2009-09-15 01:21:38

+1

我使用脚本将每个pl文件单独编译为一个cgi文件。我使用以下命令行参数:-I -X和-o – Jono 2009-09-15 16:49:33

回答

1

如果您需要独立脚本而不是独立二进制文件(这是pp的默认模式),请添加-P选项。不过,我建议不要这样做。这是运行模式最少的模式。

另请注意,PAR :: Packer DOES适用于深度依赖性。你的问题的主题有点自命不凡。事实上,PAR :: Packer本身并没有真正检查任何依赖关系,而是将其委托给Module :: ScanDeps。现在,Module :: ScanDeps是依赖扫描的一种启发式方法,并且可以通过动态加载依赖关系来进行丑陋的模糊处理。 (即在运行时生成模块名称,然后在eval中使用它们)。确实,如果你看看sources for Log::Any(CHI :: Driver :: File使用的),你很快就会发现它使用了模块的动态加载。这就是为什么:: Adapter :: Null模块没有被拾取。

通常,我们通过向Module :: ScanDeps添加一个特殊情况来解决这些问题,这些模块的作者认为打败任何类型的静态分析都是一个好主意。在获得Module::ScanDeps的固定版本之前,可以使用-c或-x选项来使pp依赖性解析使用编译或执行程序,而不仅仅依赖于静态分析。增强模块:: ScanDeps的版本为0.95,并应在一天内从CPAN提供。

+1

模块:: ScanDeps 0.95已在CPAN上到达。参看http://search.cpan.org/dist/Module-ScanDeps/ – tsee 2009-09-16 13:07:20

+1

非常感谢Steffen,这很清楚。 – Jono 2009-09-16 17:29:37

+1

我还想指出,pp -c必须在脚本被封装的同一目录中执行,否则最终会出现错误的@INC(假设您包含自己的perl模块,该模块存在于另一个目录中并且是使用BEGIN块来推入@INC或“使用库”模块)。 这给了我试图用pp -c打包脚本的麻烦。 – Jono 2009-09-16 18:31:57

3

那么,你读过documentation?它提供了许多命令行选项来包含依赖关系,甚至可以选择手动强制包含模块。

+0

谢谢布拉德。我确实已经阅读过文档,并且在PAR文档中没有任何地方指出为了生成独立脚本需要任何特定的标志。 实际上,文档中明确指出:“pp使用PAR提供的压缩打包程序和Module :: ScanDeps提供的依赖性检测启发法,创建了Perl程序的独立可执行文件,源文件逐字压缩,无需编译。 这正是我正在寻找的,但不幸的是它不起作用。有任何想法吗? – Jono 2009-09-15 16:52:15