Почему двоичные файлы имеют Cargo.lock
в системе контроля версий, а не библиотеки?
Цель Cargo.lock
— описать состояние мира во время успешной сборки. Затем он используется для обеспечения детерминированных сборок на любой машине, на которой создается пакет, гарантируя, что компилируются точно такие же зависимости.
Это свойство наиболее желательно для приложений и пакетов, которые находятся в самом конце цепочки зависимостей (двоичные файлы). В результате рекомендуется, чтобы все двоичные файлы проверяли свои файлы Cargo.lock
.
С библиотеками ситуация несколько иная. Библиотека используется не только разработчиками библиотеки, но и любыми последующими потребителями библиотеки. Пользователи, зависящие от библиотеки, не будут проверять Cargo.lock
библиотеки (даже если она существует). Именно потому, что библиотека не должна быть детерминистически перекомпилирована для всех пользователей библиотеки.
Если библиотека в конечном итоге используется транзитивно несколькими зависимостями, вполне вероятно, что желательна только одна копия библиотеки (на основе совместимости semver). Если бы Cargo использовал все файлы Cargo.lock
зависимостей, то можно было бы использовать несколько копий библиотеки и, возможно, даже конфликт версий.
Другими словами, библиотеки указывают несколько требований к своим зависимостям, но не могут видеть полную картину. Только конечные продукты, такие как двоичные файлы, имеют полную картину, чтобы решить, какие версии зависимостей следует использовать.