Создание приложения без зависимостей

Опрос

Какую технологию выбрать для создания приложения не зависящего (почти) от окружения?
Flatpack
Snap
Appimage
Виртуальная машина
Docker контейнер
LXC контейнер
Пересобирать по необходмости
Другое
redix, да, про программистов он сморозил... исключение только платные программисты, которые хотят получить халявных пользователей тестеров.
Псевдографический инсталлятор Arch Linux ver. 3.8.2
Благодарности принимаются на ЯД 410012815723874
nafanja, пробовал когда то pc-bsd (лет десять назад), там было так называемое app-cafe, которое ставило софт в подобном формате(pbi), второй скайп со всеми зависимостями весил ~ 450 метров, с тех пор я "полюбил" подобные форматы. )
In Tux We Trust
redix, это чистый виндовс вей....
у виндовс программистов, другие запросы... меньше работы, а бабла побольше.
а вот линукс это чистый коммунизм, от каждого по возможностям, каждому по потребностям...
Псевдографический инсталлятор Arch Linux ver. 3.8.2
Благодарности принимаются на ЯД 410012815723874
nafanja
виндовс вей….
Стопудово, а Ubuntu как пример со своими снапами.
In Tux We Trust
vasek
PS - у меня. например, заморожен firefox на версии firefox 56.0.2-1 - за 2 года всего раза два пришлось использовать simlink - все работает.
Можно поподробнее? У меня заморожен thunderbird версии 52.9.1.
iradia
Можно поподробнее? У меня заморожен thunderbird версии 52.9.1.
Как то описывал в этом топике, но обычно перед заморозкой желательно сделать анализ применения динамических библиотек, зависимость от других пакетов и др.
Полный список динамических библиотек можно узнать из вывода ldd или используя strace. Можно и сохранить все эти библиотеки, а при необходимости подсунуть их, но многое зависит от конкретной ситуации. Однозначного рещения нет и, главное, вечно это продолжаться тоже не может ... нюансов много и все не распишешь.
Ошибки не исчезают с опытом - они просто умнеют
vasek
Как то описывал в этом топике…
Читаю. Интересно.
sfs
Успешно использую такой вариант. Это что-то среднее между Вашими пунктами 2-4,6,7
Интересный вариант, спасибо, надо будет попробовать. Как я понимаю нужно будет сделать скрипт-обёртку над нужным файлом и всё разместить в отдельной папке.

vasek
Если дело только в этом, то сначала желательно подсунуть нужную библиотеку, используя simlink, и если сработает. то не нужна и пересборка.
Не будут ли со временем свои симлинки в системных папках причиной трудно отслеживаемых проблем? Как я понял, если есть возможность оставить работу с системными файлами менеджеру пакетов, надо её оставить ему.

Упоминание в одном месте flatpak, snap, appimage и остальных неизменно вызывает обсуждение, не ожидал увидеть столько комментариев.

Также нашлось одно из готовых решений - образ docker с нужным сервисом внутри. Правда в этом случае нужно будет еще разбираться с доступом к фс контейнера или доступом из контейнера к фс системы, думаю решаемо
archevator
Не будут ли со временем свои симлинки в системных папках причиной трудно отслеживаемых проблем?
Просто эти симлинки в один момент могут не сработать для данного приложения, но вреда системе не будет - данная библиотека не принадлежит ни одному пакету в системе. И разумеется нужно все фиксировать, чтобы знать, что менял, где менял, а при необходимости и удалить.
Пример
ls -l /usr/lib/libhunspell-1.6.so.0
lrwxrwxrwx 1 root root 33 ноя 22 2018 /usr/lib/libhunspell-1.6.so.0 -> /usr/lib/libhunspell-1.7.so.0.0.1
pacman -Qo /usr/lib/libhunspell-1.6.so.0
ошибка: Ни один пакет не содержит '/usr/lib/libhunspell-1.6.so.0'
pacman -Qo /usr/lib/libhunspell-1.7.so.0
/usr/lib/libhunspell-1.7.so.0 принадлежит hunspell 1.7.0-2

и в тоже время
readelf -d /usr/lib/firefox/libxul.so | grep NEEDED | grep libhunspell
0x0000000000000001 (NEEDED) Совм. исп. библиотека: [libhunspell-1.6.so.0]

EDIT 1 - и разумеется, что проблемная библиотека должна использоваться только одним проблемным приложением ... а потому и нужен анализ, на основании которого и применяется тот или иной способ.... и лучше, конечно, заранее сохранить копии нужных библиотек. И приходилось иногда и менять несколько байт, чтобы решить проблему.

EDIT 2 - При отладке загрузки библиотек рекомендую использовать LD_DEBUG, что позволит получить полную отладочную информацию.

EDIT 3 - Немного о номерах версий динамических библиотек и их влиянии на совместимость.
Действует следующая схема нумерации библиотек - lib.so.x.y.z
x – мажорный выпуск - мажорная версия библиотеки изменяется всякий раз, когда у неё меняется ABI и, как правило, совместимость при этом изменении не обеспечивается.
y – минорный выпуск - минорная версия библиотеки изменяется при добавлении в библиотеку новой функциональности без изменения ABI и, как правило, совместимость при изменении обеспечивается (новые функции и типы данных добавляются, но старые при этом должны сохраняться).
z – багофикс - багофикс изменяется при устранени ошибок (без добавления новой функциональности) и естественно на совместимость не влияет.
Разработчики библиотеки стараются поддерживать ABI стабильным - изменение затратно.
Ошибки не исчезают с опытом - они просто умнеют
Пробую сделать так: создал папку рядом с исполняемым файлом, скопировал туда библиотеки:
user@archlinux:/usr/lib/firebird/bin$ mkdir ld
user@archlinux:/usr/lib/firebird/bin$ ldd fbserver | cut -d' ' -f3 | xargs sudo cp -t ld
user@archlinux:/usr/lib/firebird/bin$ ls -l ld
итого 55964
-rwxr-xr-x 1 root root   198392 янв 24 00:04 ld-linux-x86-64.so.2
-rwxr-xr-x 1 root root  2149496 янв 24 00:04 libc.so.6
-rwxr-xr-x 1 root root    14512 янв 24 00:04 libdl.so.2
-rw-r--r-- 1 root root   873816 янв 24 00:04 libgcc_s.so.1
-rwxr-xr-x 1 root root 27984536 янв 24 00:04 libicudata.so.65
-rwxr-xr-x 1 root root  1959712 янв 24 00:04 libicuuc.so.65
-rwxr-xr-x 1 root root  1329264 янв 24 00:04 libm.so.6
-rwxr-xr-x 1 root root   159824 янв 24 00:04 libpthread.so.0
-rwxr-xr-x 1 root root 22616248 янв 24 00:04 libstdc++.so.6
Создал скрипт для запуска:
user@archlinux:/usr/lib/firebird/bin$ cat fbexec
#!/bin/sh
LD_LIBRARY_PATH="/usr/lib/firebird/bin/ld" exec "/usr/lib/firebird/bin/fbserver" "$@"
После запуска смотрю в proc/<pid процесса>/maps и вижу что пути к библиотекам не изменились.
user@archlinux:/proc/7086$ sudo grep icu maps
7fc2f0126000-7fc2f1bd6000 r--p 00000000 08:07 684747                     /usr/lib/libicudata.so.65.1
7fc2f1bd6000-7fc2f1bd7000 r--p 01aaf000 08:07 684747                     /usr/lib/libicudata.so.65.1
7fc2f210c000-7fc2f2170000 r--p 00000000 08:07 684774                     /usr/lib/libicuuc.so.65.1
7fc2f2170000-7fc2f2253000 r-xp 00064000 08:07 684774                     /usr/lib/libicuuc.so.65.1
7fc2f2253000-7fc2f22d8000 r--p 00147000 08:07 684774                     /usr/lib/libicuuc.so.65.1
7fc2f22d8000-7fc2f22d9000 ---p 001cc000 08:07 684774                     /usr/lib/libicuuc.so.65.1
7fc2f22d9000-7fc2f22eb000 r--p 001cc000 08:07 684774                     /usr/lib/libicuuc.so.65.1
7fc2f22eb000-7fc2f22ec000 rw-p 001de000 08:07 684774                     /usr/lib/libicuuc.so.65.1
Наверно нужно что-то еще указать (править ld.so.conf.d/*, запустить ldconfig)?
У меня конечно эксперимент не совсем чистый, т.к. нужная библиотека есть и в системно каталоге и в созданном мной. Но, как я понял, через LD_LIBRARY_PATH можно явно указать каталог для поиска библиотек.
 
Зарегистрироваться или войдите чтобы оставить сообщение.