2014-05-16 9 views
5

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

+1

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

+0

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

+0

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

Antwort

4

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.