Один из подходов к инсталляции программ -- делать один здоровый бинарник и один конфиг к нему. Понятное дело, если я напишу какую-нибудь нужную говнософтину, то заставлять даже того, кому она нужна, ковыряться без необходимости в её кишках неэтично. Вот если она окажется такой удачной и везде нужной, что её станут, например, пихать в дистрибутивы -- тут конечно лучше бы всё декомпозировать и зависимости ставить отдельно. Но таких программ появляются единицы на тысячу, да и то не на каждую =).
Экстремальный пример -- Docker. Но он сам по себе довольно замороченный.
Пример попроще -- Go и Rust, у которых штатный режим предполагает сборку жирного бинарника, зато *одного*.
Ещё один забавный пример -- JXcore. Это форк Node, который умеет паковать всё барахло в один бинарник. А оно потом берёт и почему-то работает. В идеале.
Я вчера решил этому JXcore задать хорошую трёпку.
Есть сервер с древним дебианом на ядре 2.6. Тотальный апдейт ему делать никто не хочет, ставят только апдейты на тему безопасности.
1. JXcore на него поставился и запустился. Современный JXcore на ядре 2.6 и примерно соответствующих системных библиотеках.
2. Ок, подумал я, у меня ж есть пара программок на Node. Взял свой xmpp-forwarder, и он заработал. Причём нельзя сказать, что у него совсем нет зависимостей. Явные -- `livescript`, `prelude-ls` и довольно-таки жирный `node-xmpp-client`.
3. Наконец, я решил сделать тот самый *portable standalone* бинарник. Для чего JXCore в данном случае и был нужен. Вот тут JXcore грохнулся при его сборке. Что-то не нашёл в `glibc`. Надо будет попробовать собрать бинарник на другой машинке и запустить на том серваке, я считаю.
Что характерно, никаких системных требований по минимальным версиям библиотек авторы не публикуют. Тем не менее, по-моему всё равно круто: я ведь думал, что оно там вообще работать откажется, а оно работает.
С Докером всё более или менее ясно. Если ядро достаточно новое, чтобы он сам заработал -- значит и софтина под ним скорее всего будет работать. Тем более там в контейнерах как правило какая-нибудь Ubuntu LTS. Да и вообще Докер не на ту тему немного.
Интересно, а на каком самом старом барахле могут работать *portable standalone* бинарники, сделанные компиляторами Go и Rust?