Ich möchte ein Shell-Skript in meinem Edelstein bin Verzeichnis, zusammen mit anderen Ruby-Programmen, die zu dem Paket gehören. Ich möchte dieses Shell-Skript im bin-Verzeichnis so wie es ist installiert haben (also keine Wrapper). Ist das mit Ruby Gems überhaupt möglich? Ich würde mit Post-Install-Hooks glücklich sein, wenn nicht anders möglich. Hat jemand damit Erfahrung?Verteilen Sie ein Shell-Skript mit Ruby gem und installieren Sie es im bin-Verzeichnis
Antwort
Dieses Problem ist hier beschrieben: https://github.com/rubygems/rubygems/issues/88
Wenn die Perle Sie entwickelt sich nur für den eigenen Gebrauch bestimmt ist, können Sie es einfach mit
gem install --no-wrapper my_gem
installieren kann ich glaube, Sie würden am besten schreibe ein Ruby-Skript, das dein Bash-Skript ausführt. Hier ist ein Beispiel dafür, wie das zu tun:
ist/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}`
ist/test_gem.sh
#!/bin/sh
echo "Hello World!"
test_gem.gemspec
spec.files = [
# ...
'bin/test_gem', 'bin/test_gem.sh'
]
# ...
spec.executables = ['test_gem']
HINWEIS: Vergessen Sie nicht, die beiden Dateien im bin
Ordner auf ausführbar!
Beachten Sie, dass während test_gem.sh
mit dem files
Rubygems Befehl registriert ist, ist es nicht so executables
registriert: es wird nur in dem installierten Juwel ist dir platziert werden, aber nicht umgebrochen/füttert.
Wenn Sie Ihr Juwel installieren (und ggf. rbenv rehash ausführen), führt das Aufrufen von test_gem
dazu, dass das Skript ruby Ihr Shell-Skript ausführt.
Was haben Sie versucht? Das sollte soweit ich weiß funktionieren. Ein Wrapper könnte angewendet werden, aber es sollte kein großes Problem sein. Das ist meistens so, dass Dinge wie 'bundle exec' richtig funktionieren. – tadman
Leider ist das ein Problem. Der Wrapper ist ein Ruby-Skript, das versucht, mein Shell-Skript zu laden und es als Ruby-Programm auszuführen. Es ist offensichtlich, wenn es auf Bash-Syntax trifft. – scientistician
Wenn Sie ein Ruby-Juwel schreiben, müssen Sie sich an die Konventionen halten, die es vorschreibt. Eine davon ist die Erwartung, dass Ihre Skripts mit der Ruby-Version kompatibel sind, die der Benutzer ausgewählt hat. Wenn Sie ein Shell-Skript ausführen müssen, können Sie 'exec' verwenden, um Ihren Ruby-Prozess in ein Bash-Skript mit denselben Argumenten umzuwandeln. – tadman