2013-11-25 3 views
5

В моей большой коллекции скриптов на Ruby, я начать свои сценарии с общим притоном:притона для нескольких версий

#!/usr/bin/env ruby 

Теперь я нахожу несколько сценариев, которые действительно нуждаются в определенной версии Ruby, и нет, они нет приложений Rails, которые могут быть развернуты под конкретной версией Ruby. Это всего лишь однофайловые скрипты, которые можно запускать из командной строки и не работать с версией системы.

Есть ли способ написать shebang, который устанавливает среду с rbenv/rvm перед запуском следующего кода файла?

+0

Откуда вы знаете, какой рубин нужен для каждого скрипта? Кажется, что у вас есть проблема с поиском или проблема с файловой организацией, чтобы решить эту проблему. –

ответ

1

Вам не обязательно устанавливать какую-либо среду. Все, что вам нужно, это путь к бинарнику ruby, который вы хотите запустить, и все остальное будет следовать.

Вот пример того, как можно настроить:

  1. Создать папку ~/bin. Это будет содержать указатели (символические ссылки) для всех ваших личных рубиновых двоичных файлов.

  2. Обновите свою оболочку PATH, так что ~/bin включен в путь поиска для исполняемых файлов.

  3. Symlink любой бинарный код ruby, который вам нужен в вашем ~/bin, до фактического рубинового двоичного кода.

Например, в моем ~/bin у меня есть:

ruby18 -> /opt/ruby18/bin/ruby 
ruby19 -> /opt/ruby19/bin/ruby 
ruby20 -> /opt/ruby20/bin/ruby 

Теперь у вас есть скрипт, который нужно запустить 1.9. Тогда все, что вам нужно сделать, это:

#!/usr/bin/env ruby19 

Это будет работать, если вы установили ваши драгоценные камни в каталог драгоценных камней по умолчанию для каждого рубинового исполняемого файла. Если вы установили драгоценные камни где-то в другом месте, это становится более сложным, и вам нужно будет изменить GEM_PATH перед запуском скрипта.

Если вы не хотите, чтобы получить фантазии с ~/bin то просто жёстко вашей хижина линии вместо того, чтобы указывать непосредственно рубиновую двоичный:

#!/opt/ruby19/bin/ruby 

... или эквивалентный путь rbenv/РВМ.

Наличие символических ссылок в вашем ~/bin, хотя позволит вам более легко обновить указатели на bin, если вы хотите скомпилировать новый патч ruby ​​1.9, и вы хотите поместить его в другую папку, например /opt/ruby19-p123. Затем вам просто нужно обновить символическую ссылку в ~/bin, и все ваши скрипты будут запускать новую исправленную версию.

1

rbenv будет искать файл .ruby-version установленной (например)

$ rbenv local 1.9.3-p448 

Создать простой файл, check

#!/usr/bin/env ruby 
puts RUBY_VERSION 

Сделать исполняемым

$ chmod +x check 

Выполнить это

$ ./check 

Выход

1.9.3 

Тем не менее, это не настройка каждого файла. Если есть способ изменить поведение rbenv с помощью shebang, это, вероятно, будет лучше подходит.

+0

Да, но согласился, что ваш ответ до сих пор является «1/2» решения. Другая половина написала пусковую установку, которая использует это, или, лучше, путь к рубину, чтобы затем запустить целевой скрипт с соответствующим рубином. –

+0

CD'ий в директорию может разрешить собственный вызов 'ruby', чтобы забрать'. rbenv-version'. –

+0

.ruby-версия (не .rbenv-версия) не имеет ничего общего с вашим рабочим каталогом, она основана на каталоге, в котором находится скрипт. Если вы соединяете каждый скрипт с .ruby-версией, то вы будете хорошо. В противном случае вам, вероятно, придется иметь ссылки на конкретные версии рубина, как это предлагает Каспер. Вы не можете больше делать и быть переносными, потому что у shebang не гарантируется несколько вариантов (http://stackoverflow.com/questions/4303128/how-to-use-multiple-arguments-with-a-shebang- то есть) –

Смежные вопросы