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

问题描述 投票:0回答:1

我将clusterssh打包到openSUSE,需要将#!/usr/bin/env perl的默认shebang更改为#!/usr/bin/perl。 clusterssh使用Module::Build

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

perl packaging
1个回答
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()不同,只有前者才能在这里工作。
  • 换行符是可选的,可以删除。
© www.soinside.com 2019 - 2024. All rights reserved.