Укажите shebang для проекта, используя Perl Module :: Build - PullRequest
0 голосов
/ 16 марта 2019

Я упаковываю clusterssh в openSUSE, и мне нужно изменить значение по умолчанию с #!/usr/bin/env perl на #!/usr/bin/perl. clusterssh использует Module :: Build .

Я, вероятно, буду использовать патч (, поскольку пакет Debian делает ), но мне интересно простое использование fix_shebang_line(@files) в упаковке RPM.

1 Ответ

1 голос
/ 17 марта 2019

Он уже вызывается во время процесса сборки.

В основном, неустановленные сценарии должны использовать #!/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 говорится, что она не касается строки shebang #!/usr/bin/env perl (потому что она не распознается как вызов 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; сбрасывает номер строки ($.) для каждого файла.
  • eof отличается от eof(), и здесь будет работать только первый.
  • Разрывы строк являются необязательными и могут быть удалены.
...