2014-05-16 16 views
5

Chcę umieścić skrypt powłoki w folderze bin mojego gem, wraz z innymi programami Ruby, które należą do pakietu. Chciałbym, aby ten skrypt powłoki został zainstalowany w katalogu bin jako-jest (to jest, bez wrapperów). Czy to możliwe z klejnotami Ruby? Byłbym zadowolony z haków po instalacji, jeśli nie jest to możliwe w inny sposób. Ktoś ma z tym jakieś doświadczenie?Wdróż skrypt powłoki z klejnotem Ruby i zainstaluj w katalogu bin

+1

Co próbowaliście? To powinno zadziałać, o ile wiem. Opakowanie może być stosowane, ale nie powinno to być dużym problemem. W większości przypadków rzeczy takie jak 'bundle exec' będą działały poprawnie. – tadman

+0

Niestety, to jest problem. Opakowanie to skrypt ruby, który próbuje załadować mój skrypt powłoki i wykonać go jako program Ruby. Najwyraźniej barfuje po napotkaniu składni bash. – scientistician

+0

Jeśli piszesz klejnot Ruby, musisz trzymać się konwencji, które narzuca. Jednym z nich jest oczekiwanie, że twoje skrypty będą kompatybilne z wersją Ruby wybraną przez użytkownika. Jeśli potrzebujesz uruchomić skrypt powłoki, możesz zawsze użyć 'exec', aby przekonwertować proces Ruby do skryptu bash z tymi samymi argumentami. – tadman

Odpowiedz

4

Ten problem jest opisany tutaj: https://github.com/rubygems/rubygems/issues/88

Jeśli gem jesteś opracowanie jest przeznaczone tylko do użytku własnego, wystarczy zainstalować go z

gem install --no-wrapper my_gem 

Myślę, że najlepszym napisz skrypt ruby, który uruchamia twój skrypt basha. Oto przykład, w jaki sposób zrobić to:


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'] 

UWAGA: Nie zapomnij ustawić oba pliki w folderze bin do wykonywalnego!

Należy pamiętać, że podczas test_gem.sh jest zarejestrowany komendy files rubygems, to nie jest zarejestrowany jako executables: to po prostu być umieszczone w zainstalowanych gem reż ale nie zawinięty/podkładano.

Jeśli zainstalujesz gem (i uruchomi ponownie rehash w razie potrzeby), wywołanie test_gem spowoduje skrypt ruby ​​wykonujący twój skrypt powłoki.