为CPAN(和CorporatePAN)打包perl脚本的推荐方式是什么?

问题描述:

最近我看了CPAN上的一个模块,该模块附带了一个要安装的脚本 ,这让我感到惊讶。将 中的脚本包含在公共CPAN中,并且如果对于将在内部CPAN服务器上发布的 软件包有任何不同建议,建议采用什么方式?为CPAN(和CorporatePAN)打包perl脚本的推荐方式是什么?

剧本开始是这样的:

#!/usr/bin/perl 

eval 'exec /usr/bin/perl -S $0 ${1+"[email protected]"}' 
    if 0; # not running under some shell 

两个问题

难道我理解正确的EVAL部分是不必要的? 安装期间将由CPAN客户端嵌入,并且在Windows上安装时,它将会有很大的不同。

什么是推荐的sh-bang线? 那会是

#!/usr/bin/env perl 

而不是上面的?

分发正在安装时,它正在安装对于某些特定的perl,并且应明确设置#!使用该perl(如在$Config{startperl}中给出的)。据我所知,所有的模块安装程序都为你做这件事。 (更新:正如cjm所指出的那样,只有#!as distributed才会运行perl,而不是env。)

eval东西传统上被包含在内,即使脚本调用sh scriptname时也会自动使用perl。这是无害的。

+0

实际上,'eval'是因为'#!'[not invented](http://en.wikipedia.org/wiki/Shebang_%28Unix%29#History)直到Version 8 Unix。早期版本只是假设一个可执行文本文件必须是一个shell脚本。 – cjm 2013-04-13 19:05:40

只需使用

#!/usr/bin/perl 

(或者可选,无论路径perl是在开发机器上。)

当模块::编译或MakeMaker的安装脚本,它将改变#!行匹配安装模块的perl。它还将添加“eval exec”行,除了在Windows下,它将创建.bat文件。 (该CPAN客户端无关,与此。)

如果使用

#!/usr/bin/env perl 

那么安装不会意识到这是一个Perl脚本,并不会修改#!线。