1 Określ shebang na projekcie za pomocą Perla Module :: Build

pytanie utworzone w Sat, Mar 16, 2019 12:00 AM

Pakuję clusterssh do openSUSE i muszę zmienić domyślny shebang z #!/usr/bin/env perl na #!/usr/bin/perl. clusterssh używa Module :: Build .

Prawdopodobnie użyję poprawki ( jak Pakiet Debiana to ), ale zastanawiam się nad łatwym użyciem fix_shebang_line(@files) w opakowaniach RPM.

    
0
  1. @ ikegami Nie, to nie w przypadku clusterssh (mój widelec, który zmienił shebang github.com/pevik/clusterssh/tree/system-perl-in-shebang ). Czy możesz opublikować powtarzalne MCVE ?
    2019-03-17 10: 16: 41Z
1 odpowiedzi                              1                         

Jest już wywoływana podczas procesu budowania.

Zasadniczo odinstalowane skrypty powinny używać #!/usr/bin/perl lub #!perl, a proces instalacji powinien przepisać go do punktu perl używanego do uruchomienia instalatora. W ten sposób skrypt zainstalowany przez /usr/bin/perl użyje /usr/bin/perl, a skrypt zainstalowany przy użyciu /home/ikegami/usr/perlbrew/perls/5.26.2t/bin/perl użyje /home/ikegami/usr/perlbrew/perls/5.26.2t/bin/perl.

(Dotyczy to zarówno instalatora Module :: Build, jak i instalatora ExtUtils :: MakeMaker.)

Należy zauważyć, że dokumentacja fix_shebang_line mówi, że nie dotyka linii shebang #!/usr/bin/env perl (ponieważ nie jest rozpoznawana jako wywołanie perl), więc po prostu łatanie skryptów w celu użycia #!/usr/bin/perl zamiast #!/usr/bin/env perl wykonuje sztuczkę.

Po wprowadzeniu tej zmiany katalog pomostowy gotowy do instalacji (blib) wyprodukowany przez ./Build będzie zawierać edytowane pliki.

$ 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

Nie zawracałem sobie głowy uruchomieniem ./Build install, którego głównym zadaniem jest skopiowanie plików z katalogu pomostowego do ich ostatecznych lokalizacji. Poza tym ta część musi i tak zostać zastąpiona przez menedżera pakietów (zakładając, że po prostu umieszczasz zawartość katalogu blib w swoim pakiecie).


Jeśli w jakiś sposób musisz to zrobić samodzielnie, możesz użyć następującego:

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

Uwagi:

  • Użyj perl, aby skrypty były używane.
  • założono narzędzia GNU; dostosuj w razie potrzeby.
  • close ARGV if eof; resetuje numer linii ($.) dla każdego pliku.
  • eof jest inny niż eof() i tylko pierwszy będzie działał tutaj.
  • Podziały wierszy są opcjonalne i mogą zostać usunięte.
1
2019-03-17 17: 46: 23Z
  1. Dziękujemy za informacje! Podczas gdy Debian może nie używać ./Build install, Fedora i openSUSE . Sprawdzę, czy jest spowodowany przez ./Build install, czy nie.
    2019-03-17 15: 44: 04Z
  2. Nie. Build install po prostu kopiuje już naprawiony plik
    2019-03-17 16: 22: 53Z
  3. find bin -type f -exec perl -i -pe's/^#!\S*perl\S*/#!$^X/ if $. == 1; close ARGV if eof;' {} + (Użyj perl do użycia. Założono narzędzia GNU; dostosuj jakokonieczne)
    2019-03-17 17:41:27 Z
źródło umieszczone tutaj