Почему менеджер пакетов предпочитает библиотеку?

68

Когда я думаю о плюсах и минусах папки статической библиотеки и менеджера пакетов, я чувствую, что папка библиотеки - лучший подход.

Плюсы, которые я вижу с папкой библиотеки:

  1. Нет необходимости во внешнем инструменте для управления пакетами.
  2. Нет подключения к интернету требуется построить.
  3. Быстрая сборка (без проверки пакетов).
  4. Более простая среда (требуется меньше знаний).

Плюсы я вижу с менеджером пакетов:

  1. Помогает со сложными деревьями зависимостей (и этим можно управлять, загружая зависимость вместе со всеми ее зависимостями).
  2. Помогает проверить наличие новой версии.

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

Игнасио Солер Гарсия
источник
33
Я думаю, что вы действительно спрашиваете о преимуществах пакетирования по сравнению с необходимыми библиотеками. Вы получите более релевантные ответы, если будете использовать эти термины.
Килиан Фот
3
Что мешает вам создать док-контейнер для агента сборки, содержащий все необходимое и, возможно, вообще не позволяющий доступ в интернет (который не должен быть необходим для сборки)? Я думаю, что вы больше против изучения нового инструмента, чем на самом деле рассматриваете аргументы. Вы когда-нибудь работали над большим проектом, в котором используются зависимости, управляемые вручную? Это не так здорово, как кажется.
Каяман
3
@Kayaman: изучение нового инструмента стоит времени (денег) команды, и я хотел бы убедиться, что мы вкладываем его в нужную вещь. Мой опыт работы с большими проектами заключается в том, что зависимости достаточно стабильны (они почти никогда не меняются), и, возможно, поэтому менеджер пакетов кажется мне дорогим. В любом случае, я просто перечислял «за» и «против» после того, как поработал некоторое время с Nuget и провел некоторое время с ним.
Игнасио Солер Гарсия
2
@sebkur Вы можете хранить локальные копии всех ваших пакетов. Мы держим текущие версии всех наших зависимостей под локальным контролем версий. Единственный раз, когда диспетчеру пакетов требуется соединение, это когда мы делаем обновления.
17 из 26
1
@ 17of26: вы не узнаете, как настроить агент сборки для установки nuget и запустить его по запросу за 10 минут. Также вы этого не сделаете, если у вас есть проект с несколькими решениями, где одни и те же проекты используются в разных решениях.
Игнасио Солер Гарсия

Ответы:

122

В других ответах отсутствует важный момент:

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

Знание того, какие библиотеки вы используете и какую версию, очень важно, если вы:

  • необходимо обновить библиотеку из-за критической ошибки / дыры в безопасности;
  • или просто нужно проверить, влияет ли объявленная дыра в безопасности на вас.

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

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


Для решения других ваших вопросов:

Нет необходимости во внешнем инструменте для управления пакетами.

Да, но а) как разработчик программного обеспечения, вам все равно нужно устанавливать множество инструментов, поэтому обычно еще один не имеет значения, и б) обычно в каждом поле есть только один или несколько менеджеров пакетов (Maven / Gradle для Java, npm для JS / TypeScript и т. д.), поэтому вам не нужно устанавливать десятки из них.

Нет подключения к интернету требуется построить.

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

Быстрая сборка (без проверки пакетов).

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

Более простые условия (требуется меньше знаний).

Правда, но, как объяснено выше, libпапка также требует знаний. Кроме того, как объяснено выше, вы, вероятно, будете работать только с несколькими менеджерами пакетов, о которых вы уже знаете.

sleske
источник
171
«Нет необходимости во внешнем инструменте для управления пакетами» - да. Теперь это работа твоего мозга. Удачи, мозг!
Пол Д. Уэйт
58
Любой, кто всерьез думает, что наличие папки lib - это «более простая среда», должен просто попытаться выяснить дерево зависимостей, скажем, для nuget Microsoft.AspNetCore.All . Давай, не жди меня, я вернусь через день.
Во
14
Кроме того, интернет-браузер, который вы используете для поиска библиотек вручную, будет считаться внешним инструментом для управления пакетами. Наряду со всем остальным, что вы используете (файловый менеджер ОС и т. Д.) Для подготовки и размещения библиотек. Таким образом, реальный выбор - один внешний инструмент (менеджер пакетов) против многих.
NemesisX00
3
Просто к вашему сведению, я недавно пытался работать с gradle на автономном ПК. Не повезло, Android Studio не запускает мое приложение, и я получаю неясное сообщение об ошибке, и это после того, как я впервые запустил онлайн для зависимостей. Только в таких ситуациях вы действительно замечаете, насколько зависимыми от менеджеров пакетов становится создание программного обеспечения ...
FRob
8
@ PaulD.Waite Пока мы занимаемся этим, мы избавились от тех надоедливых «языков», о которых все говорят. В конце концов, все равно все сводится к машинному коду, поэтому в моей фирме мы вырезали среднего человека. Теперь это эффективность!
CorsiKa
40

Плюсы папки lib быстро исчезают после перехода от мелкомасштабной разработки к более крупной работе.

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

Вам не нужно подключение к интернету для менеджера пакетов. Вы можете использовать локальные репозитории.

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

Более простые условия (требуется меньше знаний)? Опять же, в малом масштабе развитие определенно возможно. Возможно, вы сможете полностью удержать проект в своей голове, вплоть до каждой из немногих используемых библиотек. Добавьте простой make-файл / другой скрипт сборки, и вы получите полный пакет.

Но это не делает среду проще, она работает только в простых средах. В более масштабных разработках вы будете рады, что вместо стандартных решений вы используете стандартные инструменты. В конце концов, вам нужно выучить его только один раз (и когда менеджер пакетов du jour заменяется новой классной вещью, вы должны также изучить это).

Kayaman
источник
21
@IgnacioSolerGarcia: Проще только, если ничего не пойдет не так. Что если новая версия библиотеки A также нуждается в обновленных B и C? Что делать, если он все еще работает, но вносит незначительные ошибки? Это все часть «управления зависимостями».
слеске
18
@IgnacioSolerGarcia говорит, что «скачать файл» не совсем правильно рисует картину. Допустим, загрузите 20 файлов и убедитесь, что их версии совместимы. Никакой работы не избежать. Обновление пакетов также не является теоретической ситуацией, если только вы не решили заморозить версии зависимостей и готовы принять возможные проблемы (ошибки, недостатки безопасности), возникающие в результате этого.
Каяман
12
@IgnacioSolerGarcia "загрузить файл" - вы имели в виду (1) найти правильный веб-сайт проекта (некоторые размещены на github, некоторые на sourceforge, некоторые на их собственных сайтах), (2) перейти на страницу загрузки, (3) найти правильную версию , (4) скачать, (5) разархивировать и уронить куда-нибудь. Это кажется гораздо больше работы, чем blah install libfoo. А затем умножьте это на, скажем, 5 зависимостей.
el.pescado
5
@IgnacioSolerGarcia Хорошо, какие файлы мне «просто» нужно загрузить, чтобы этот ньюгет работал правильно? И это в основном самая тривиальная настройка для проекта ASP.NET Core. На практике у вас будет гораздо больше зависимостей.
Во
6
@Ignacio Это основной мета-нюгет для запуска и запуска самого простого приложения ASP.Net Core. Правда, в старые добрые времена полного фреймворка все было «проще», потому что вы только что получили большие монолитные библиотеки, которые были все версии одновременно, а выпуск обновления занял у вас годы. Эта модель в основном устарела по очень веским причинам, а не только в мире .NET. Вам придется привыкнуть к тому, что целая модель множества небольших библиотек делает одну конкретную вещь, и честное использование менеджера пакетов - самая легкая часть перехода.
Во
35

Вам не хватает многих преимуществ менеджеров пакетов.

  1. Менеджеры пакетов позволяют избежать проверки больших (несколько мегабайт или более) двоичных файлов в системе контроля версий. Это является анафемой для многих инструментов контроля версий, одним из которых является распространяющийся git. У нас был репозиторий, ограничивающий размеры Bit Bucket пару месяцев назад, потому что разработчики проверяли в CocoaPods. Другой проект был уже на полпути, когда мы мигрировали из SVN, потому что мы проверяли все наши двоичные файлы lib (и не использовали NuGet). Поскольку менеджеры пакетов будут загружать пакеты на лету для каждого разработчика, они устраняют необходимость проверять эти двоичные файлы.
  2. Они предотвращают смешивание несовместимых файлов / библиотек. Папки могут содержать смешанные версии файлов библиотеки, если кто-то не очистит их должным образом во время обновления. Я видел случай, когда половина двоичных файлов в папке была обновлена, что привело к очень странным ошибкам. (Он даже не разбился!) Нам потребовались буквально месяцы (не человеческие часы, а просто общее время), чтобы выяснить проблему. Позволяя менеджеру пакетов контролировать всю папку, вы не можете получить смешанные версии; Вы гарантируете последовательность. Они также значительно усложняют использование несовместимых зависимостей , автоматически обновляя все вместе, устанавливая различные версии, где это необходимо, или даже просто выдавая предупреждения или ошибки при попытке использовать несовместимые версии библиотек.
  3. Они устанавливают общее соглашение для управления библиотеками. Когда новые разработчики приходят в ваш проект, команду, компанию и т. Д., Они, вероятно, знают соглашения менеджера пакетов. Это означает, что им не нужно тратить время на выяснение мелких деталей управления библиотеками в вашей кодовой базе.
  4. Они предоставляют вам стандартный способ создания версий и распространения ваших собственных зависимостей и файлов, которые не принадлежат вашему хранилищу. Я даже лично использовал их для некоторых больших статических файлов данных, которые требовались моему приложению, поэтому он хорошо работает для управления версиями, помимо двоичного кода.
  5. Некоторые менеджеры пакетов предоставляют дополнительные функции во время установки. NuGet добавит зависимости и файлы содержимого в ваш файл csproj и даже может добавить элементы конфигурации в файл конфигурации.
  6. Их файлы списка пакетов документируют версии ваших библиотек в едином централизованном месте. Мне не нужно щелкать правой кнопкой мыши на DLL и смотреть номер версии, чтобы выяснить, какую версию библиотеки я использую. В Python автор библиотеки, возможно, даже не включил номер версии в py-файлы, поэтому я даже не смогу узнать версию библиотеки из них.
  7. Они препятствуют общезаводской установке зависимостей. Менеджеры пакетов предоставляют обычный способ установки зависимостей без глобального установщика . Когда вашими опциями являются папка lib и глобальная установка, многие разработчики библиотек предпочтут предлагать свои библиотеки в основном как глобальные установки, а не как загружаемые двоичные файлы, которые вы должны настроить самостоятельно. (История MS демонстрирует это. Это также относится ко многим библиотекам в Linux.) Это на самом деле делает управление несколькими проектами более сложным, поскольку у вас могут быть проекты с конфликтующими версиями, и некоторые разработчики, безусловно, предпочтут, казалось бы, более простую глобальную установку, чем имея собственную библиотеку lib. реж.
  8. Они стремятся централизовать хостинг и распространение. Вам больше не нужно зависеть от сайта этой случайной библиотеки. Если они обанкротятся, на сайте успешного менеджера пакетов все равно будут загружены все версии. Разработчикам также не нужно выискивать множество веб-сайтов только для загрузки новых библиотек; у них есть место, чтобы посмотреть в первую очередь и даже просматривать различные варианты. Кроме того, проще зеркалировать пакеты, организованные стандартным способом, чем вручную размещать копии всего с специальных веб-сайтов.

Вы также преувеличиваете ценность своих «преимуществ».

  1. Нет необходимости во внешнем инструменте для управления пакетами.

    «Внешний» к чему? Я проверяю исполняемый файл NuGet в своих репозиториях. Это единственный двоичный файл, в котором я чувствую себя хорошо, регистрируясь, так как он маленький и означает, что мне не нужно проверять другие двоичные файлы.

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

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

  2. Нет подключения к интернету требуется построить.

    Я не могу подключиться к своей базе данных без сетевого подключения. Если база данных размещена на Amazon, мне все равно нужно полное интернет-соединение. Мне нужно подключение к Интернету, чтобы протолкнуть изменения через систему контроля версий; Сервер сборки также не может извлекать код для сборки без какого-либо сетевого подключения. Вы не можете отправлять или получать электронную почту без него. Вы не можете скачать библиотеки, чтобы поместить их в папку lib без них! Постоянно развиваться без подключения к интернету практически неслыханно. В некоторых редких случаях, когда это необходимо, вы можете решить эту проблему, загрузив пакеты в место, которое может использовать менеджер пакетов. (Я знаю, что NuGet и pip очень рады вытащить из простой папки или сетевого диска; я подозреваю, что большинство других также могут.)

  3. Быстрая сборка (без проверки пакетов).

    30 секунд во время автоматической сборки и 5 секунд во время локальной сборки - хороший компромисс с преимуществами, которые я описал выше. Это тривиальные временные рамки, которые, как правило, даже не стоит рассматривать в сравнении с проблемами, которые решают преимущества.

  4. Более простые условия (требуется меньше знаний).

    Во всяком случае, один инструмент для управления пакетами, а не для управления библиотеками, на самом деле не является честным сравнением. Без инструмента вы должны изучить любой пользовательский процесс, который использует проектуправлять своими библиотеками. Это означает, что вы никогда не уверены, применимы ли ваши знания к любому новому проекту, к которому вы подходите. Вы должны будете иметь дело с любым подходом сборной солянки, или придумать свой собственный. Это может быть каталог, содержащий все библиотеки, или что-то более странное. Может быть, чтобы избежать проверки библиотек, кто-то поместил их все на сетевой диск, и единственным индикатором версии является имя папки. Как это или глобальная установка действительно лучше? Для сравнения, менеджер пакетов дает вам четкое соглашение, которое будет применяться ко всем встречающимся проектам.

Общей темой является то, что они обеспечивают согласованность, документацию и функции не только внутри проектов, но даже между ними. Это упрощает жизнь каждого.

jpmc26
источник
10
«Постоянное развитие без подключения к интернету практически неслыханно». Хотелось бы, чтобы я не знал лучше. Из-за соображений безопасности в полностью разделенных сетях ведется большая разработка. Да, это так же весело, как и звучит, но это абсолютно выполнимо. Вам просто нужно настроить собственную инфраструктуру для хранения пакетов (т. Е. Свой собственный фид Nuget).
Во
1
Хотя наличие собственной инфраструктуры на самом деле является одной из немногих вещей, которая имеет смысл в любом случае: вы не хотите быть надежными во внешней инфраструктуре. Если тот или иной недоступен по той или иной причине, гораздо лучше иметь запасной вариант, который гарантирует, что ваши разработчики могут продолжать развиваться. (И прежде чем кто-нибудь скажет мне, что у этого nuget.org, npm или <вставка любимого репозитория пакетов> никогда не будет таких проблем, возможно, подумайте еще раз .)
Voo
3
@IgnacioSolerGarcia Создание соглашения о проекте, о департаменте или о компании не лучше, чем просто соглашение, которое все знают без ведома. Кроме того, управление пакетами обеспечивает лучшую работу по обеспечению соблюдения соглашения, поскольку делает выполнение соглашения менее трудным, чем его нарушение. Также, как я уже упоминал, я фиксирую NuGet напрямую и вызываю его в скрипте сборки, поэтому мне не нужно его устанавливать. Я собрал серверные установки на минимальном уровне.
jpmc26
2
@ jpmc26 Imho, твой первый нумерованный список получит пользу от некоторого акцента .
Сорен Д. Птюс
1
@ SørenD.Ptæus Готово.
jpmc26
16

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

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

До Nuget, если бы я хотел обновить все наши зависимости до последней версии, мне пришлось бы:

  1. Отследите, где я мог получить все обновленные библиотеки
  2. Скачайте их и распакуйте / установите
  3. Добавить новые версии в систему контроля версий
  4. Вручную просмотрите все ссылки в наших проектах и ​​обновите их, чтобы они указывали на новые сборки

С 27 проектами и десятками сборок зависимостей этот процесс был очень подвержен ошибкам и мог занимать часы.

Теперь, когда мы обновились до использования Nuget, все это сделано для меня одной командой.

17 из 26
источник
Согласитесь, в этом и заключается пункт 2 профи. В любом случае, изменение зависимостей - это то, что мы делаем редко (вероятно, из-за отсутствия надлежащих автоматических регрессионных тестов).
Игнасио Солер Гарсия
9
Обновление зависимостей - это нечто гораздо менее болезненное, если вы делаете это регулярно.
17 из 26
1
Эти тесты автоматизированы? Как долго они бегут? Даже если для запуска полного набора тестов требуется 24 часа, это все равно позволяет обновлять зависимости каждые несколько дней с небольшими недостатками (даже если вы, вероятно, не будете делать это довольно часто на практике). Даже если они являются ручными и неизбежными, используя ручную установку, вы можете потратить дни на прохождение тестов, только чтобы выяснить, что они терпят неудачу из-за того, что вы пропустили некоторую зависимость, а затем вам придется начать заново после установки, чего не произойдет. используя управление пакетами ...
Шон Бертон,
3
Вам не нужны регрессионные тесты на новые версии программного обеспечения? Просто обновите зависимости, когда вы уже тестируете релиз.
17 из 26
4
«У нас они не полностью автоматизированы, а инструмент слишком велик, чтобы его выполнять (на его тестирование или автоматизацию могут уйти месяцы)», - вот в этом ваша большая проблема. Эти тесты должны были быть на месте с самого начала. Ваша проблема не в том, что использование менеджеров пакетов не дает никаких преимуществ, ваша проблема в том, что контекст, в котором вы работаете, слишком нарушен другими способами, чтобы вы могли им пользоваться.
Муравей P
14

Нет необходимости во внешнем инструменте для управления пакетами

Это что-то не так, не так ли? Если я использую менеджер пакетов, мне не нужна папка lib. Я также не должен управлять пакетами самостоятельно.

Не требуется подключение к интернету, чтобы построить

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

Быстрая сборка (без проверки пакетов)

Это довольно незначительный спидбуст, но вы, возможно, можете сказать об этом.

Более простые среды (требуется меньше знаний)

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

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

С папкой lib вы управляете пакетами только для этого проекта, а менеджер пакетов позволяет вам делать это для всей среды разработки с помощью одного инструмента.

Афон В.К.
источник
Не так просто настроить агент сборки для установки менеджера пакетов во время сборки, восстановления зависимостей и так далее. С папкой lib ничего не нужно.
Игнасио Солер Гарсия
4
Я думаю, это зависит от того, какой язык / языки вы используете. С такими языками, как Ruby или Rust, управление пакетами настолько хорошо интегрировано, что его использование совершенно тривиально.
Шон Бертон,
Ну, я специально опускал это, чтобы иметь более широкие комментарии, но я говорю конкретно об облаке NuGet, C # и VSTS.
Игнасио Солер Гарсия
4
@Ignacio Независимо от того, какую систему сборки вы используете, которая не делает процесс восстановления NuGets совершенно тривиальным, ее следует немедленно выбросить. К счастью, VSTS делает это примерно так же легко, как и получает ( документация ): есть задача восстановления NuGet, на которую вы указываете файл решения и указываете, какие источники NuGet использовать - для простого простого проекта все nuget.orgбудет в порядке (шаблон по умолчанию должен уже настроен таким образом).
Во
3
@Ben RVM не является менеджером пакетов. Менеджер пакетов для Ruby - это RubyGems. RVM управляет версиями самого Ruby, и для этого лучше использовать rbenv ...
Шон Бертон,
5

Это разница между просто использованием библиотек (каталог lib) и их использованием, поддерживая метаинформацию (менеджер пакетов) . Такая метаинформация касается номеров версий, (транзитивных) зависимостей между библиотеками и тому подобным.

Дискуссии об аде DLL, совместимости библиотек, системе java-модулей, OSGi и т. Д. Должны, по крайней мере, быть достаточно убедительными в некоторой ценности наличия некоторой формы управления зависимостями.

  • Проблемы с версией библиотеки и зависимостями могут быть пустой тратой времени.

Также есть преимущество общего (локального) хранилища, поэтому нескольким проектам не нужно хранить копии импортированных библиотек. Если у вас есть проект с 20 подмодулями, то некоторые из этих модулей имеют 40 нечетных зависимостей.

  • Больше структуры
  • Больше обрезки библиотек
  • Нет специальных человеческих решений о библиотеках
Joop Eggen
источник
3

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

Но для всего остального это похоже на разработчика, принимающего на себя роль менеджера пакетов:

  • Разработчик должен будет загрузить библиотеки (требуется интернет)
  • Разработчик должен будет проверить наличие новых версий вручную
  • ...

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

FranMowinckel
источник
4
Даже для устаревших или измененных библиотек все менеджеры пакетов, которые я видел до сих пор, предлагают возможность загружать локальные зависимости в ваш локальный репозиторий. Но хорошо, вот где вы теряете часть опыта «все работает автоматически».
Халк
@ Халк, если это библиотека с открытым исходным кодом, то вы можете (и, вероятно, должны) просто опубликовать свою версию и, таким образом, сделать ее видимой для менеджера пакетов. Либо, передавая изменения сопровождающим, либо выпуская свой собственный форк библиотеки.
оставлено около
Если вы изменили библиотеку, сопровождающий которой не отвечает на исправление почты, тогда возникает проблема выяснения, как настроить диспетчер пакетов так, чтобы другие пакеты, зависящие от библиотеки, могли также быть удовлетворены вашей измененной библиотекой.
Дамиан Йеррик
1

Есть еще одна проблема, не затронутая другими вопросами: совместное использование депов.

Допустим, у вас есть два пакета, создающих одну и ту же библиотеку. В лучшем случае не будет никаких конфликтов, но одно и то же место на жестком диске / SSD используется дважды. В худшем случае будут конфликты вариаций, например версии.

Если вы используете менеджер пакетов, он установит библиотеку только один раз (для каждой версии) и уже предоставит путь к ней.

PS: конечно, вам нужна динамическая связь (или похожая функция на вашем языке), чтобы получить этого профессионала.

вал
источник
-5

Одна из основных причин, по которой разделяемые библиотеки считались прогрессом в системах Unix и Windows 90-х годов, заключалась в том, что они могли снизить использование ОЗУ при загрузке нескольких программ, использующих один и тот же набор библиотек. Пространство кода должно быть выделено ОДИН РАЗ для каждой конкретной библиотеки и версии этой библиотеки , единственное использование памяти для каждого экземпляра остается для статических переменных.

Многие операционные системы реализуют разделяемые библиотеки таким образом, что зависит от таких механизмов, как unix mmap () api, что подразумевает, что библиотека должна быть не только одной и той же версии, но фактически того же ФАЙЛА. Это просто невозможно в полной мере использовать для программы, которая поставляется с собственным набором библиотек.

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

rackandboneman
источник
4
Этот вопрос не говорит об общих библиотеках, но о зависимости от папки библиотеки.
Игнасио Солер Гарсия
1
Это не отвечает на вопрос ОП
esoterik