Desidero inserire uno script di shell nella directory bin del mio gem, insieme ad altri programmi Ruby che appartengono al pacchetto. Vorrei avere questo script di shell installato nella directory bin così com'è (cioè senza wrapper). È possibile ciò con le gemme Ruby? Sarei felice con i ganci post-installazione, se non altrimenti possibile. Qualcuno ha qualche esperienza con questo?Distribuire uno script di shell con Ruby gem e installare nella directory bin
risposta
Questo problema è descritto qui: https://github.com/rubygems/rubygems/issues/88
Se la gemma si sta sviluppando è destinato esclusivamente per uso personale, si può semplicemente installarlo con
gem install --no-wrapper my_gem
Credo che faresti meglio scrivi uno script ruby che esegue il tuo script bash. Ecco un esempio su come farlo:
bin/test_gem
#!/usr/bin/env ruby
bin_dir = File.expand_path(File.dirname(__FILE__))
shell_script_path = File.join(bin_dir, 'test_gem.sh')
`#{shell_script_path}`
bin/test_gem.sh
#!/bin/sh
echo "Hello World!"
test_gem.gemspec
spec.files = [
# ...
'bin/test_gem', 'bin/test_gem.sh'
]
# ...
spec.executables = ['test_gem']
NOTA: Non dimenticare di impostare entrambi i file nella cartella bin
a eseguibile!
Nota che mentre test_gem.sh
è registrato con il comando files
Rubygems, non è registrata come executables
: sarà solo essere messo in dir della gemma installato ma non avvolto/spessorato.
Se si installa la gemma (ed è possibile eseguire rbenv rehash se necessario), chiamando lo test_gem
verrà generato lo script ruby che esegue lo script della shell.
Cosa hai provato? Questo dovrebbe funzionare per quanto ne so. Potrebbe essere applicato un wrapper, ma non dovrebbe essere un grosso problema. Per lo più cose come 'bundle exec' funzioneranno correttamente. – tadman
Sfortunatamente, questo è un problema. Il wrapper è uno script ruby che tenta di caricare il mio script di shell ed eseguirlo come un programma Ruby. Ovviamente barfs quando si incontra la sintassi di bash. – scientistician
Se stai scrivendo una gemma Ruby, devi attenersi alle convenzioni che impone. Uno di questi è l'aspettativa che i tuoi script siano compatibili con la versione di Ruby selezionata dall'utente. Se hai bisogno di eseguire uno script di shell, puoi sempre usare 'exec' per convertire il tuo processo Ruby in uno script bash con gli stessi argomenti. – tadman