Как сделать так, чтобы пакет Ruby gem копировал файлы в произвольные места? - PullRequest
4 голосов
/ 15 декабря 2008

Предположим, у вас есть пакет программного обеспечения. Вы хотите сделать его драгоценным камнем, потому что драгоценные камни де-факто являются стандартным способом распространения чего-либо в мире Ruby. Драгоценные камни отличные - для библиотек. Но для реальных приложений система Rubygems кажется отсутствующей. Только «недавно» они представили способ пометить исполняемые файлы, которые должны быть размещены где-нибудь в общесистемном исполняемом PATH. К сожалению, Ruby gems все еще нуждается в других аспектах упаковки программного обеспечения, а именно в размещении файлов конфигурации в таких местах, как / etc, или документации в / usr / share / doc. Либо это? Мой вопрос:

Могу ли я поместить инструкции или код в gemspec для установки конфигурации в / etc и документацию в каком-то разумном, стандартизированном месте (например, / usr / share / doc)? Или, возможно, в качестве обходного пути можно запустить сценарий после установки для выполнения этих задач?

Для справки: спецификация GemSpec .

Обратите внимание, что rubygems.org был недоступен на момент написания этой статьи. Вот кеш Google этой страницы: http://74.125.95.132/search?q=cache:JwJO6slR4BwJ:www.rubygems.org/read/chapter/20+http://www.rubygems.org/read/chapter/20%23page85&hl=en&ct=clnk&cd=1

Если вы изучите файл spec.rb в репозитории и прокрутите вниз до конца (выполните поиск «: section: Обязательные атрибуты gemspec»), вы увидите, что кажется поддерживаемым в настоящее время. атрибутов. Я не вижу там ничего похожего на то, что я хочу.

Ответы [ 3 ]

1 голос
/ 15 декабря 2008

Вы не должны / должны делать это ... гемы предназначены для использования в качестве библиотек ... а не в качестве приложений самостоятельно (исследуйте систему пакетов приложений своего дистрибутива для подобных вещей).

Вы это знаете. И я это знаю. Но «они» этого не знают. Для многих лун, регулярные запросы и комментарии были: «Есть ли драгоценный камень?» "Может ли это быть установлено как драгоценный камень?" "Почему ты не делаешь драгоценный камень?" «Я не устанавливал это, потому что это не драгоценный камень».

Правильно или нет, желательно или нет, Джо Рубист надеется, что все будет самоцветом. Только старые школьники знакомы и, похоже, допускают сделки типа «ruby setup.rb».

Во всяком случае, мое приложение действительно является отдельным приложением; Я вряд ли могу представить кого-либо, в том числе это, как библиотека. Может быть, как часть коллекции приложений, но ... использование в качестве библиотеки кажется надуманным, но если этот день когда-нибудь наступит, я перейду этот мост, когда доберусь до него (чтобы помочь людям с любыми конфликтами, которые включение может принести).

И нет никакого различия между «dev / test / stage / prod». Это простое старое приложение, вы запускаете его из командной строки.

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

1 голос
/ 09 ноября 2015

2015-11-11 Вот ситуация: RubyGems поддерживает перехваты до и после установки / удаления в качестве расширений команды gem. Другими словами, эти хуки применяются ко всем установленным драгоценным камням и не предназначены для настройки в конкретном драгоценном камне. Они вызываются в файле с именем operating_system.rb, который обычно находится в /usr/lib64/ruby/2.2.0/rubygems; или в любом месте и версии Ruby установлен. Крючки используются таким образом:

# /usr/lib/ruby/x.y.z./rubygems/operating_system.rb
Gem.pre_install do | installer |
  # do whatever
end

Gem.pre_uninstall do | installer |
  # do whatever
end

Gem.post_install do | installer |
  # do whatever
end
. . .

Если углубиться в документацию по API, то кажется, что для использования внешних действий, специфичных для драгоценного камня, доступны плагины. См. http://guides.rubygems.org/plugins/#executablehooks и https://github.com/rvm/executable-hooks в качестве примера. Однако, похоже, что все они влияют на приложение RubyGem в целом, а не на один гем. И такие плагины должны быть установлены как самоцветы, чтобы иметь эффект.

Мне кажется, что специфичные для gem хуки до и после установки являются проблемой безопасности. Кто-то, устанавливающий системный уровень Gem, по определению имеет привилегию root и позволяет RubyGem выполнять произвольные действия, помимо простой установки библиотеки, имеет очевидные последствия для безопасности.

Я проверяю это у ребят из Ruby (2015-11-10). Возможно, эти хуки предназначены только для людей, устанавливающих сам RubyGem на разных платформах.

RubyGems сейчас (2015) поддерживает pre_install() и post_install() хуки как методы, которые принимают & block в качестве аргументов. Предположительно, вы можете делать все, что захотите, в любом из них, при условии, что вы не вернете false ни из одного из них. Возвращение nil в порядке, но возврат false прервет установку гема.

1 голос
/ 15 декабря 2008

Краткий ответ: нет

Длинный ответ: Вы не должны / не должны делать это ... гемы предназначены для использования в качестве библиотек ... а не в качестве приложений самостоятельно (исследуйте систему пакетов приложений своего дистрибутива для такого рода вещей). Кроме того, вы не можете предполагать, что ваш драгоценный камень будет использоваться только «один раз» ... теоретически несколько проектов / приложений могут включать в себя ваш драгоценный камень, и, хотя, возможно, в вашем драгоценном камне есть некоторые особенности, которые не позволяют ему что-то, что может быть настроено глобально ... вы все равно не захотите этого делать из-за других архитектурных проблем, таких как разработка / настройка вашего приложения для работы в различных фазовых средах (dev / test / stage / production). В лучшем случае вы можете просто заметить, как создать файлы / etc / config в README и включить служебное приложение, чтобы запросить у пользователя значения.

...