Здравствуйте, ·, Вы писали:
M>>Ну в таком случае, конечно, придется контролировать самому, т.к. C ABI не подразумевает каких-либо метаданных. Тем не менее, несколько версий все равно можно подключить.
·>Неясно тогда какой же конкретно сабж решается.
Я отвечаю в рамках вопроса в корне этого подтреда. О точном определении "ада зависимостей" — к ТС.
M>>Хотя в расте бинарные зависимости это очень нишевая вещь, встречаются редко.
·>Я имею в виду обычные зависимости — crates. Они же не компилируются все каждый раз, верно?
Нет, не каждый раз, но полностью статическими библиотеками они от этого не становятся, т.к. компилятор генерирует дополнительную метадату. Которую можно, в частности, использовать для контроля версий крейтов из которых пришли типы.
·>Да и хуже того, ну обнаружил компилятор проблему, нарисовал тебе ошибку. Теперь тебе придётся разбираться что с чем не совместимо и как же это теперь решать и как собственно убедиться, что решение будет работать. И так при каждом минорном обновлении каждой зависимости.
Нет. Подзависимости с версиями, например, 1.1 и 1.2 будут объединены в одну зависимость с версией как минимум 1.2. Если подзависимости требуют точные версии (=1.1 и =1.2), то резолвер выдаст ошибку (поэтому пинить версии в нормальных релизах считается дурным тоном и практически никогда не делается). Несколько копий зависимостей может быть только если их мажорные версии различаются. См.
https://doc.rust-lang.org/cargo/reference/resolver.html
M>>И что это меняет? Если это сорцы, компилятор точно так же проконтролирует.
·>Проконтролирует что именно? Каждая либа компилируется отдельно, в разное время, разными командами, деплоится. Потом у себя в проекте ты подключаешь несколько либ — и упс.
Если это
сорцы, то все компилируется в одно и то же время.
M>>Если это скомпилированная либа, то бардак на совести того кто ее компилировал.
·>Именно. Т.е. никакого сабжа нет.
Если ты подключаешь несколько разных версий одной бинарной либы, конвертирование между ее публичными типами это твоя забота, и никто за тебя ее не решит. Формат статических либ не подразумевает информации о версиях, так что компилятор тут бессилен. В расте практически все зависимости в сорцах, так что такой проблемы обычно не возникает.
Если же либа использует какой-то глобальный ресурс и не может синхронизировать это использование даже не с другими либами, а с самой собой, только лишь другой версии — ну тогда надо разработчиков этой либы пинать.