Пакетные менеджеры
Тема этого поста навеяна обсуждением пакетных менеджеров в рассылке Erlang. К сожалению, обсуждение завяло, так и не успев начаться.
Действительно, даже для мира Ruby эта проблема актуальна. С появлением bundler паковать приложения во что-то, запускающееся почти сразу, стало проще. Но все равно, какие-то gem-ы не встают, если нет системных библиотек, которые надо поставить с помощью apt-get (в debian дистрибутивах). Итого, мы имеем для Ruby как минимум 2 пакетных менеджера — один для системы, а второй для самого ruby. При этом, gem-ы часто зависят от каких-то системных пакетов, и было бы логично, чтобы эти системные пакеты вставали сами, если бы того требует gem.
Для gem-ов, которым нужно что-то скомпилировать, нужен компилятор. Вообще, мне кажется странным держать на серверах приложений компилятор. Хотелось бы, чтобы было как в apt — gem-ы бы распространялись в бинарном виде.
С другой стороны apt не может держать несколько версий одного и того же пакета в системе, и поэтому не может быть заменителем gem в этом смысле. Более того, у каждого более или менее развитого языка есть свой собственный «велосипед», в смысле, менеджер пакетов. И это тоже понятно, потому что Python, Java, Ruby и т.д. работают на различных платформах, некоторые из которых ничего про системные пакетные менеджеры не знают.
Я здесь еще ничего не скажу про rvm и rbenv, которые тоже некоторым образом относятся к этой теме, и больше напоминают костыли, чем рабочее решение.
Занимаясь управлением конфигурацией, которая как раз и призвана делать выкатку любого приложения надежно повторяемой, мы сталкиваемся с тем, что эти неявные зависимости между gem и deb пакетами приходится прописывать руками. И я не чувствую в этом инженерной красоты.
Это пост-вопрос, чтобы обсудить идеи того, как «правильно» упаковывать приложения. Я еще буду возвращаться к этой теме, но надеюсь, что мои дорогие читатели подкинут мне пищи для размышления в комментариях к этой записи.