LINUX.ORG.RU
ФорумTalks

Про зависимости и самодостаточные пакеты


0

0

по мотивам Решил отрезать от основного топика, чтобы обсудить это отдельным вопросом.

Вопрос: почему так много зависимостей и почему нецелесообразно в данной ситуации делать самодостаточные пакеты.

Итак, мало кто понимает, как обстоит ситуация на самом деле. Ест бинарник, чтобы каждый кодер не писал 100500 раз одни и те же функции, которые выполняют какие-то типовые действия, придумали библиотеки, которые являются коллекциями функций, которые каждый кодер может вызвать в своей программе. Это существенно сокращает время разработки и уменьшает размер программы. При этом разные программы могут юзать одну и ту же либу, вызывая ее функции, тем самым сокращать размер потребляемой памяти <-- вот эти характеристики являются первостепенными в событии «появление библиотек»

Вообще теоретически всё очень круто: делаем либу, кодеры вызывают функции и куда не посмотри - всё очень здорово. НО! т.к GNU/Linux не стандартизирован нет офиц библиотек, которые бы покрывали бОльшую часть потребностей кодеров, которые разрабатывают программы. Попытка сделать что-то - это создание toolchain. Смотрим в вики

GNU toolchain — набор созданных в рамках проекта GNU пакетов программ, необходимых для компиляции и генерации выполняемого кода из исходных текстов. Являются стандартным средством разработки программ и ядра ОС Linux.

Но т.к зависимости есть(как свершившийся факт), то делаем вывод о том, что функций библиотек, которые есть в toolchain недостаточно для осуществления разработки программ.

Хорошо, есть сторонние библиотеки. И это нормально. Но проблема в том, что никто не проверяет софт, какие функции юзаются из этих библиотек. Я подозреваю, что 98% всех функций, которые юзаются во всем софте(актуальном) размазаны по всем этим зависимостям. Т.е так: есть функцияХ0 в glibc. Она выполняет то что нужно. Но васян, который кодит, по каким-то причинам использует другую либу, в которой есть функцияХ1, выполняющая то же самое, что функция glibc.функцияX0. Из-за этого мы факт появления зависимости, которой по определению не должно быть. Думаю, что уровень дебилизма там достигает невероятных масштабов и кмк там даже есть такой вариант развития события:

Кодер юзает функцию somelib10.функцияX10, которая зависит от somelib9.функцияX9, которая зависит от somelib8.функцияX8. А в функции somelib8.функцияX8 вызывает функцию glibc.функцияX0. И самое интересное, что функционал функци somelib10.функцияX10, которую вызывал васян равна функционалу функции glibc.функцияX0

Похоже на шутку, не правда ли? Но это, блин, не шутка. В итоге мы имеем несколько зависимостей и одну большую glibc. Хотя, васян мог просто заюзать glibc, которую юзают многие кодеры(прямо - что есть норм или косвенно(но обосновано косвенно).

И поэтому мы получаем такие финты

┌─[debian]─[~] └──╼ apt-get install xfburn Reading package lists... Done Building dependency tree Reading state information... Done The following NEW packages will be installed: xfburn 0 upgraded, 1 newly installed, 0 to remove and 1 not upgraded. Need to get 410 kB of archives.

┌─[✗]─[debian]─[~] └──╼ apt-get install brasero Reading package lists... Done Building dependency tree Reading state information... Done The following additional packages will be installed: aspell aspell-en brasero-cdrkit brasero-common cdrdao dvdauthor enchant genisoimage gnome-user-guide growisofs gstreamer1.0-pulseaudio libbrasero-media3-1 libenchant1c2a libgstreamer-plugins-bad1.0-0 libiptcdata0 libjavascriptcoregtk-4.0-18 libnautilus-extension1a libperl4-corelibs-perl libquvi-0.9-0.9.3 libquvi-scripts-0.9 libtotem-plparser-common libtotem-plparser18 libtracker-sparql-1.0-0 libwebkit2gtk-4.0-37 libyelp0 lua-bitop lua-expat lua-json lua-lpeg lua-socket wodim yelp yelp-xsl Suggested packages: aspell-doc spellutils vcdimager libdvdcss2 tracker readom cdrkit-doc gstreamer1.0-plugins-bad libenchant-voikko libwebkit2gtk-4.0-37-gtk2 The following NEW packages will be installed: aspell aspell-en brasero brasero-cdrkit brasero-common cdrdao dvdauthor enchant genisoimage gnome-user-guide growisofs gstreamer1.0-pulseaudio libbrasero-media3-1 libenchant1c2a libgstreamer-plugins-bad1.0-0 libiptcdata0 libjavascriptcoregtk-4.0-18 libnautilus-extension1a libperl4-corelibs-perl libquvi-0.9-0.9.3 libquvi-scripts-0.9 libtotem-plparser-common libtotem-plparser18 libtracker-sparql-1.0-0 libwebkit2gtk-4.0-37 libyelp0 lua-bitop lua-expat lua-json lua-lpeg lua-socket wodim yelp yelp-xsl 0 upgraded, 34 newly installed, 0 to remove and 1 not upgraded. Need to get 39.7 MB of archives. After this operation, 147 MB of additional disk space will be used. Do you want to continue? [Y/n]

┌─[✗]─[debian]─[~] └──╼ apt-get install k3b Reading package lists... Done Building dependency tree Reading state information... Done The following additional packages will be installed: aspell aspell-en cdparanoia cdrdao docbook-xml docbook-xsl dvd+rw-tools enchant genisoimage growisofs gstreamer1.0-pulseaudio icoutils k3b-data kate-data katepart kde-runtime kde-runtime-data kdelibs-bin kdelibs5-data kdelibs5-plugins kdoctools libattica0.4 libcanberra-pulse libdbusmenu-qt2 libdlrestrictions1 libenchant1c2a libfam0 libgpgme++2v5 libimobiledevice6 libiodbc2 libk3b6 libk3b6-extracodecs libkactivities6 libkatepartinterfaces4 libkcddb4 libkcmutils4 libkcompactdisc4 libkde3support4 libkdeclarative5 libkdecore5 libkdesu5 libkdeui5 libkdewebkit5 libkdnssd4 libkemoticons4 libkfile4 libkhtml5 libkio5 libkjsapi4 libkjsembed4 libkmediaplayer4 libknewstuff3-4 libknotifyconfig4 libkntlm4 libkparts4 libkpty4 libkrosscore4 libktexteditor4 libkxmlrpcclient4 libmusicbrainz5cc2v5 libnepomuk4 libnepomukquery4a libnepomukutils4 libntrack-qt4-1 libntrack0 libperl4-corelibs-perl libplasma3 libplist3 libpolkit-qt-1-1 libqt4-qt3support libsolid4 libsoprano4 libthreadweaver4 libupower-glib3 libusbmuxd4 libvcdinfo0 ntrack-module-libnl-0 oxygen-icon-theme phonon phonon-backend-gstreamer phonon-backend-gstreamer-common plasma-scriptengine-javascript sgml-data soprano-daemon sound-theme-freedesktop upower usbmuxd vcdimager wodim Suggested packages: aspell-doc spellutils docbook docbook-dsssl docbook-defguide dbtoepub docbook-xsl-doc-html | docbook-xsl-doc-pdf | docbook-xsl-doc-text | docbook-xsl-doc docbook-xsl-saxon fop libsaxon-java libxalan2-java libxslthl-java xalan cdrskin cdrkit-doc libterm-readline-gnu-perl | libterm-readline-perl-perl k3b-extrathemes k3b-i18n normalize-audio movixmaker-2 kde-config-cddb finger libenchant-voikko fam libusbmuxd-tools iodbc hspell media-player-info phonon-backend-vlc phonon4qt5-backend-gstreamer perlsgml w3-recs opensp virtuoso-minimal The following NEW packages will be installed: aspell aspell-en cdparanoia cdrdao docbook-xml docbook-xsl dvd+rw-tools enchant genisoimage growisofs gstreamer1.0-pulseaudio icoutils k3b k3b-data kate-data katepart kde-runtime kde-runtime-data kdelibs-bin kdelibs5-data kdelibs5-plugins kdoctools libattica0.4 libcanberra-pulse libdbusmenu-qt2 libdlrestrictions1 libenchant1c2a libfam0 libgpgme++2v5 libimobiledevice6 libiodbc2 libk3b6 libk3b6-extracodecs libkactivities6 libkatepartinterfaces4 libkcddb4 libkcmutils4 libkcompactdisc4 libkde3support4 libkdeclarative5 libkdecore5 libkdesu5 libkdeui5 libkdewebkit5 libkdnssd4 libkemoticons4 libkfile4 libkhtml5 libkio5 libkjsapi4 libkjsembed4 libkmediaplayer4 libknewstuff3-4 libknotifyconfig4 libkntlm4 libkparts4 libkpty4 libkrosscore4 libktexteditor4 libkxmlrpcclient4 libmusicbrainz5cc2v5 libnepomuk4 libnepomukquery4a libnepomukutils4 libntrack-qt4-1 libntrack0 libperl4-corelibs-perl libplasma3 libplist3 libpolkit-qt-1-1 libqt4-qt3support libsolid4 libsoprano4 libthreadweaver4 libupower-glib3 libusbmuxd4 libvcdinfo0 ntrack-module-libnl-0 oxygen-icon-theme phonon phonon-backend-gstreamer phonon-backend-gstreamer-common plasma-scriptengine-javascript sgml-data soprano-daemon sound-theme-freedesktop upower usbmuxd vcdimager wodim 0 upgraded, 90 newly installed, 0 to remove and 1 not upgraded. Need to get 72.2 MB of archives. After this operation, 182 MB of additional disk space will be used. Do you want to continue? [Y/n]

Пилить самодостаточные пакеты не имеет смысла т.к самодостаточный k3b будет весить 3гб. Почему? Смотрим выше.



Последнее исправление: Xwo (всего исправлений: 1)

Она выполняет то что нужно. Но васян, который кодит, по каким-то причинам использует другую либу, в которой есть функцияХ1, выполняющая то же самое, что функция glibc.функцияX0.

такой фигней Qt кстати страдает. Но в общем-то терпимо, ибо набор либ-то стаднартный.

dikiy ★★☆☆☆
()

А смысл в самодостаточном k3b? Нужен самодостаточный KDE, ставящийся в /opt. И все будет хорошо: кдешники получат своего монстра и смогут его обновлять хоть каждый день, система останется стабильной и не будет засрана тыщами ненужно-пакетов.

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

bread
()
Последнее исправление: bread (всего исправлений: 1)

ты неправильно понял цитату из вики

тулчейн никаким образом к библиотекам не относится

Harald ★★★★★
()

Сама идея либ хреновая. Если нужен функционал, надо запрашивать функционал, а не либу+название функции.
Например, кому-то надо нарисовать окно с кнопкой. Должен быть запрос на рисование окна таких-то размеров с кнопкой таких-то размеров в таком-то месте и коллбеком. Кодеру нужно только передать свои пожелания в заданном формате, а ОС найти любую подходящую под задачу либу. При таком подходе на корню отмирают все проблемы переписывания софта под новый гтк/кутэ и ненужные зависимости. Всё будет крутиться на интерфейсах с переходниками и весь ад унесётся туда. Жопа, конечно, просто сдвинется, то там можно будет придумать какие-нибудь автотесты и пр. костыли, а с либами придумать ничего нельзя и если нужна либа х, то мы вообще хз, какой кодеру функционал был нужен из её 500 функций.

crutch_master ★★★★★
()

Предлагаю юниксвей, на каждую функцию своя либа

Satou ★★★★
()

Пока все страдают жуйнёй, Delphi тем временем делает самодостаточный исполняемый файл, который вырезает одну-две функции необходимые для отрисовки окна например, а не тянет за собой QtGui, размером 25МБ. Имея все исходники, размер k3b, при таком подходе был бы 7МБ максимум....

xwicked ★★☆
()
Последнее исправление: xwicked (всего исправлений: 1)

Использую модульный дистрибутив. Модули условно подразделяем на базовые и дополнительные, предполагается что базовые есть постоянно в системе.

Когда модуль делаешь, добавляются только библиотеки которых нет в базовых модулях а также можно прописать зависимость от других дополнительных модулей. В случае если в базовых модулях более старая версия библиотеки, решается вопрос по обновлению базового модуля, либо можно использовать LD_LIBRARY_PATH= и ложить библиотеки в отдельно от общесистемных.

irton ★★★★★
()
Последнее исправление: irton (всего исправлений: 1)
Ответ на: комментарий от irton

библиотеки, по хорошему, нужно анально огораживать, а не делиться ими.
поиметь pwned.so в истеме не весело, но когда весь твой софт начнёт её использовать — будет ещё грустнее.
сендбоксы в массы.

system-root ★★★★★
()
Ответ на: комментарий от system-root

В базовых модулях библиотеки libc, xorg и xcb*, libz. Т.e. Самое основное. Остальное в дополнительных.

Если использовать LD_LIBRARY_PATH=, то другие программы эти библиотеки не увидят.

irton ★★★★★
()
Последнее исправление: irton (всего исправлений: 1)
Ответ на: комментарий от system-root

Поставь чистую систему и выполни apt-get install k3b и посмотришь сколько реально зависимостей вытянет. Сейчас-то да, когда 15 гб всех пакетов стоит, осталось вытянуть 72мб

Xwo
() автор топика
Ответ на: комментарий от Xwo

Поставь чистую систему

ubuntu-minimal из https://cloud-images.ubuntu.com/minimal/releases/

~# apt install k3b --no-install-recommends
Need to get 90.2 MB of archives
ну т.е. 90мб вместе и иксами, которые как бы не особо считаются.
конечно, ты можешь сказать, что в распакованном виде это вест 497 MB, но, например тот же snap использует сжатые образы squashfs. ненужно ничего распаковывать.

system-root ★★★★★
()
Последнее исправление: system-root (всего исправлений: 1)
Ответ на: комментарий от Jetty

Не было такого, чтобы разными либами можно было рисовать, по сути, одно и тоже окно ни в первом, ни во втором, ни, тем более, в третьем.

crutch_master ★★★★★
()
Ответ на: комментарий от xwicked

Пока все страдают жуйнёй, Delphi тем временем делает самодостаточный исполняемый файл, который вырезает одну-две функции необходимые для отрисовки окна например

Если пройтись по цепочки зависимостей (либы тоже могут дёргать функционал друг друга) то он всё равно станет непомерно жирным. Плюс ты можешь не знать, что действительно нужно, пока не запустишь свой код.

crutch_master ★★★★★
()
Ответ на: комментарий от crutch_master

Если пройтись по цепочки зависимостей (либы тоже могут дёргать функционал друг друга) то он всё равно станет непомерно жирным. Плюс ты можешь не знать, что действительно нужно, пока не запустишь свой код.

В коде чётко прописаны все либы и фукции используемые.

procedure Button1Click(Sender: TObject);
begin
  {"Чистим" адрес функции от "грязи"}
  @GetSimpleText := nil;
  {Пытаемся загрузить библиотеку}
  LibHandle := LoadLibrary('MYDLL.DLL');
  {Если все OK}
  if LibHandle >= 32 then begin
    {...то пытаемся получить адрес функции в библиотеке}
    @GetSimpleText := GetProcAddress(LibHandle,'GetSimpleText');
    {Если и здесь все OK}
    if @GetSimpleText <> nil then
      {...то вызываем эту функцию и показываем результат}
      ShowMessage(StrPas(GetSimpleText(True)));
  end;
  {И не забываем освободить память и выгрузить DLL}
  FreeLibrary(LibHandle);
end;
Нет ничего сложного рекурсивно пройтись по дереву исходников и скопировать все функции которые использует 'GetSimpleText' себе в проект, например и скомпилировать.Это напишется один раз и 20 лет можно будет использовать, а не придумывать изощрённые костыли. Размер ощутимо сократится всё равно и программа станет портабельна между всеми дистрибутивами от Fedora 1 и до сегодняшних дней.

xwicked ★★☆
()
Последнее исправление: xwicked (всего исправлений: 1)
Ответ на: комментарий от xwicked

Это опция strip, но так же может быть передана линкеру, в том числе через компилятор.

SR_team ★★★★★
()
Ответ на: комментарий от SR_team

Пишешь его или пишешь прокси. Надо только заморочиться с неймспейсом, чтобы там было что-то типа pupkin.dialogform с кучкой параметром, который потом можно сделать совместимым с любым вменяемым dialogform через тесты гр.Пупкина или еще какие-нибудь костыли.

crutch_master ★★★★★
()
Ответ на: комментарий от xwicked

Ну это тот же жир, только в профиль. Да и у либ есть свои зависимости тоже. Этот GetSimpleText может тянуть за собой почти всю либу. Ну будет у тебя зависимостей не 3гб, а 1.5. Если для каждой поделки надо всё это выкачивать, проблема останется.

crutch_master ★★★★★
()
Ответ на: комментарий от crutch_master

Ну будет у тебя зависимостей не 3гб, а 1.5

Не будет. Я когда игрался с Delphi, то там есть такое понятие как пакеты BPL. Так вот, что если есть пару окошек у программы, то она весит 300КБ, а если использовать пакеты, то программа становится 45КБ, но при этом с собой нужно носить 2-е либы по 1-2 МБ, что увеличивало размер и я это не использовал.
То есть, когда вырезаются отдельные функции в исполняемый файл, то он работает на всех компах, где нету этих пакетов BPL. Так что давно есть способы условно нормальной переносимости, так же и там из всей либы используются пару функций.

xwicked ★★☆
()
Ответ на: комментарий от system-root

окей, не 3гб, а ВСЕГО-ЛИШЬ 495. Не много ли для писалки, не? Вопрос не о snap с squashfs, вопрос о бинарниках, которые должны весить в 20 меньше, чем они весят сейчас. Хотя, даже 24mb - дофига для обычной писалки. Вот 2.4мб - самое то

Как раз тем, что для писалки надо 495мб зависимостей, я и указываю на проблему.

Xwo
() автор топика
Последнее исправление: Xwo (всего исправлений: 1)
Ответ на: комментарий от xwicked

Не будет. Я когда игрался с Delphi

Ну, это замечательно, что ты когда-то там игрался. Но нынешняя разработка - это не делфи. Приложению, вот, нужна половина qt. Реально нужна. И другому приложению тоже она нужна. Итого у тебя 2 приложения и у которых внутри по почти целому qt. А кому-то нужен целый хром. И таких много. И вот они все тащат этот хром с собой не только на диск, а еще в оперативку. Может быть на самом деле он им и не нужен, то там отрисовка окошка в принципе немыслима без всего движка и её просто невозможно как-то отрезать.
Итого: кодерам вообще нельзя давать линковаться ни с чем и переходить надо к декларативщине, когда кодер просто говорит что его программа должна делать а система подбирать для этого инструменты. Это сразу убьёт говноподелки типа электрона или сраных тулкитов.

crutch_master ★★★★★
()
Ответ на: комментарий от Xwo

не тупи. минус 495 диска ты получишь при использовании apt.
если скомпелять этот твой k3b во что-то вроде снапа — будет примерно 80 мегабайт.
то, что это дерьмо тянет за собой vlc, кодеки и даже protobuf — вопрос к погромистам.

system-root ★★★★★
()
Ответ на: комментарий от system-root

тебе еще раз говорят, какое отношение имеет снап ко всему этому и какое отношение имеет сжатый squashfs?

Xwo
() автор топика
Ответ на: комментарий от SR_team

Вот возьмём, простое окно для ввода. Есть твой SR_team.inputDialog, который передаёт, например, геометрию окна, надписи (заголовок, подпись поля ввода, дефотлное значение, подписи для кнопок ok/cancel) и получает строку. Есть какой-то qt.inputDialog, который делает тоже самое, плюс еще может картинки приделывать на фон или на кнопки. Ты можешь написать в своём интерфейсе, что SR_team.inputDialog совместим с qt.inputDialogQTCool и на этом успокоиться. Но, если где-то есть gtk.inputDialogGTKVeryCool, который делает тоже самое, что qt.inputDialog, но у него другие названия полей. Из этого мы можем сделать прокси common.GUIInputDialog, в который прописывается весь этот зоопарк диалогов и можно вызывать любые, хоть твой (если решишь сделать себе либу), хоть qtшный, хоть гткшный, хоть велосипед Васяна.
И дело не в том, что у тебя не будет ада зависимостей. Они будут, но их можно будет упорядочить. Если говорить не о периферии, то можно приделать еще кучу тестов типа common.pregexp.test и если васянам нужны pregexp, то они просто пишут что они хотят видеть от него, система прогоняет их вход/выход через тесты и они спокойно ставят common.pregexp в зависимость, которую пользовательская система разрешает хоть перлом, хоть нодой, хоть чёртовой матерью.

crutch_master ★★★★★
()
Ответ на: комментарий от Xwo

который раз именно? уточни, говорят или спрашивают?
несмотря на это, отношение имеет такое, что apt не позволяет тебе засунуть все зависимости в контейнер и пожать его. в отличии от. в реальности ты получаешь все эти непонятные зависимости и ещё экономишь пол гига.
и это реальность прямо сейчас. она не сходится с текстом из твоего поста чуть менее чем совсем никак.

system-root ★★★★★
()
Ответ на: комментарий от system-root

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

Ты с таким невозмутимым видом предлагаешь лечить гланды через анус, что тебе даже можно позавидовать.

и это реальность прямо сейчас. она не сходится с текстом из твоего поста чуть менее чем совсем никак.

Решение проблем - это решения, которые приводят к изменению реальности.

Xwo
() автор топика

kdelibs-bin

Подожди ещё пару-тройку лет, пока в стабильный дебиан не завезут k3b на kf5.

greenman ★★★★★
()
Ответ на: комментарий от system-root

не тут, нет?

несмотря на это, отношение имеет такое, что apt не позволяет тебе засунуть все зависимости в контейнер и пожать его

PS: да ты, я смотрю, приколист.

Xwo
() автор топика
Последнее исправление: Xwo (всего исправлений: 1)
Ответ на: комментарий от system-root

ubuntu-minimal из https://cloud-images.ubuntu.com/minimal/releases/

~# apt install k3b --no-install-recommends
Need to get 90.2 MB of archives

вот этой самой консоли с образа минимал. она не содержит иксов. тебе их всякио придётся ставить для к3б

darkenshvein ★★★★★
()
Ответ на: комментарий от darkenshvein

ну во-первых не «всяко». оно уже тянет x11-common и можно запустить разными способами. от форвардинга иксов, до lxc exec.
во-вторых ну иксы. и чё? ну ставить. и чё? а ещё комп желательно купить. с монитором. столько трат ради запуска.
как это к теме треда относится?

system-root ★★★★★
()
Последнее исправление: system-root (всего исправлений: 1)
Ответ на: комментарий от darkenshvein

это зависимость совершенно другого уровня, нежели зависимости, от которых зависит выволнение опкодов в бинарнике k3b

Xwo
() автор топика
Ответ на: комментарий от Jetty

Про поделки ms нечего говорить. Можно считать, что их и не было. Ms перестал их поддерживать - они сдохли. Всё. Не было такой технологии, не существовало никогда, никогда ничего не «взлетало» или «падало» (тем более, если там был какой-то «патент» на api или еще что-нибудь).

crutch_master ★★★★★
()
Ответ на: комментарий от darkenshvein

срачь был про «я тут не пробовал, но слышал что говно. мало кто понимает. сейчас вам расскажу как программы по 3 гига будут весить»

system-root ★★★★★
()

Пилить самодостаточные пакеты не имеет смысла т.к самодостаточный k3b будет весить 3гб. Почему? Смотрим выше.

Syntax error „самодостаточный“ is not define.

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

init_6 ★★★★★
()
Ответ на: комментарий от darkenshvein

ubuntu-minimal из https://cloud-images.ubuntu.com/minimal/releases/
~# apt install k3b --no-install-recommends
Need to get 90.2 MB of archives

90МБ это немного. Во-вторых, надо учитывать что там тянется много графики, не о носящейся к этой программе, например вся дефолтная тема иконок, например. А сам программный код с библиотеками занимает скорей всего где-то четверть или меньше.
Если бы пакет делался самодостаточным, он бы не тащил с собой всю тему иконок и прочую графику, а только то что используется программой. Но это зависит от лени собиральщика, могут и запихать весь Qt целиком и все кдешные иконки, ибо так быстрее.

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.