使用Perl Module :: Build在项目上指定shebang

时间:2019-03-16 19:14:58

标签: perl packaging

我正在将clusterssh包装到openSUSE,并且需要将默认shebang从#!/usr/bin/env perl更改为#!/usr/bin/perl。 clusterssh使用Module::Build

我可能会使用补丁(as Debian package do),但是我想知道fix_shebang_line(@files)在RPM包装中是否易于使用。

1 个答案:

答案 0 :(得分:1)

在构建过程中已经调用了它。

基本上,已卸载的脚本应使用#!/usr/bin/perl#!perl,并且安装过程应将其重写为指向用于运行安装程序的perl的位置。这样,/usr/bin/perl安装的脚本将使用/usr/bin/perl,而/home/ikegami/usr/perlbrew/perls/5.26.2t/bin/perl安装的脚本将使用/home/ikegami/usr/perlbrew/perls/5.26.2t/bin/perl

(这适用于Module :: Build安装程序和ExtUtils :: MakeMaker安装程序。)

请注意,fix_shebang_line的文档说它没有触及#!/usr/bin/env perl的shebang行(因为它不被认为是对perl的调用),因此只需修补脚本以使用用#!/usr/bin/perl代替#!/usr/bin/env perl可以解决问题。

进行此更改后,blib生成的可安装的登台目录(./Build)将包含已编辑的文件。

$ perl -e'CORE::say $^X'
/home/ikegami/usr/perlbrew/perls/5.26.2t/bin/perl

$ for fn in ccon crsh csftp cssh ctel; do printf '%-6s ' "$fn:"; head -n 1 "bin_PL/$fn"; done
ccon:  #!/usr/bin/perl
crsh:  #!/usr/bin/perl
csftp: #!/usr/bin/perl
cssh:  #!/usr/bin/perl
ctel:  #!/usr/bin/perl

$ perl Build.PL
Could not get valid metadata. Error is: ERROR: Missing required field 'dist_abstract' for metafile

Could not create MYMETA files
Creating new 'Build' script for 'App-ClusterSSH' version 'v4.13.203'

$ ./Build
Building App-ClusterSSH
Using perl binary: /home/ikegami/usr/perlbrew/perls/5.26.2t/bin/perl
Using perl version v5.26.2
Generating: /home/ikegami/tmp/clusterssh/bin_PL/cssh
Generating: /home/ikegami/tmp/clusterssh/bin_PL/csftp
Generating: /home/ikegami/tmp/clusterssh/bin_PL/ccon
Generating: /home/ikegami/tmp/clusterssh/bin_PL/crsh
Generating: /home/ikegami/tmp/clusterssh/bin_PL/ctel
Generating: /home/ikegami/tmp/clusterssh/bin_PL/clusterssh_bash_completion.dist

$ for fn in ccon crsh csftp cssh ctel; do printf '%-6s ' "$fn:"; head -n 1 "blib/script/$fn"; done
ccon:  #!/home/ikegami/usr/perlbrew/perls/5.26.2t/bin/perl
crsh:  #!/home/ikegami/usr/perlbrew/perls/5.26.2t/bin/perl
csftp: #!/home/ikegami/usr/perlbrew/perls/5.26.2t/bin/perl
cssh:  #!/home/ikegami/usr/perlbrew/perls/5.26.2t/bin/perl
ctel:  #!/home/ikegami/usr/perlbrew/perls/5.26.2t/bin/perl

我不必费心运行./Build install,其主要任务是将文件从登台目录复制到其最终位置。此外,无论如何,都需要由软件包管理器替换该部分(假设您只是将blib目录的内容放入软件包中)。


如果您需要某种方式自己做,则可以使用以下内容:

find bin -type f \
   -exec perl -i -pe'
      s/^#!\S*perl\S*/#!$^X/ if $. == 1;
      close ARGV if eof;
   ' {} +

注意:

  • 使用您希望脚本使用的perl
  • 假设使用
  • GNU工具;进行必要的调整。
  • close ARGV if eof;重置每个文件的行号($.)。
  • eofeof()不同,只有前者可以在这里工作。
  • 换行符是可选的,可以删除。