2012-05-18 3 views
2

Кажется, что исполняемые файлы для драгоценного камня обычно хранятся в папке /bin, и весь код хранится в папке /lib. У меня есть сторонние двоичные исполняемые файлы, которые мне нужно включить в мой драгоценный камень. Должен ли я поместить их в папку /bin или /lib?В камне CLI, где я храню сторонние двоичные исполняемые файлы?

Из того, что я видел, папка /bin больше подходит для системных исполняемых файлов или сценариев, которые я хочу, чтобы моя система могла вызывать из командной строки. Поэтому я не уверен, должен ли я включать сторонние двоичные файлы в папку /bin. Они должны быть вызваны по мере необходимости из кода /lib, а не из командной строки.

Я полагаю, что могу разместить их в папке /lib/binaries. Впоследствии, есть ли наилучшая практика для вызова этих исполняемых файлов из моего кода?

+0

Не могли бы вы объяснить немного больше? О каких библиотеках сторонних организаций вы говорите? –

+0

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

ответ

2

Вообще говоря, вы не хотите включать в приложение «сторонние исполняемые файлы»; в идеале, если они RubyGems, вы можете просто зависеть от них в своем gemspec.

При этом, если у вас есть хороший повод, чтобы сделать это, вы можете гарантировать, что они распределены в вашем RubyGem по:

  • размещая их в bin
  • Обеспечение того, чтобы они включены в files атрибут в вашем gemspec
  • Обеспечение того, чтобы они были включены в атрибут executables в ваш gemspec.
  • Убедитесь, что установлен bindir.

Так что, если у вас есть / /бен /бен/your_app /бен/other_app /бен/other_app2 /lib/your_app.rb

Вам gemspec нужно будет выглядеть следующим образом :

spec = Gem::Specification.new do |s| 
    s.name = 'your_app' 
    s.version = '1.2.3' 
    s.author = 'Your' 
    s.email = '[email protected]' 
    s.platform = Gem::Platform::RUBY 
    s.summary = 'Your app summary' 
    s.description = 'Your app description` 
    s.files   = [ 
    'bin/your_app', 
    'bin/other_app', 
    'bin/other_app2', 
    'lib/your_app.rb', 
    ] 
    s.executables = ["your_app","other_app","other_app2"] 
    s.require_paths = ["lib"] 
    s.bindir = 'bin' 
end 

Когда пользователь устанавливает ваше приложение через RubyGems, три исполняемых файла будут находиться на своем пути.

+0

Это было очень полезно. Все работает хорошо, за исключением одной маленькой проблемы. Один из моих исполняемых файлов, kindlegen (двоичный файл для mac cli), терпит неудачу с «недопустимым мультибайтным символом (US-ASCII)». Я могу вызвать bin/kindlegen непосредственно из местоположения абсолютного пути gem, но когда сам камень выполняет его, я получаю ошибку. –

+0

Решено это обходным путем. Есть что-то о том, как Gem.bin_path выполняет файлы в/bin, которые вызвали ошибку кодирования при непосредственном вызове двоичного файла. Я просто создаю файл в/bin, который вызвал двоичный код с помощью system(). Кажется, работает. –

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