У меня есть простой проект, основанный на pyo3 . В настоящее время/ранее использовалась версия 0.20.0, но недавно появилась новая версия — версия 0.21.2. Я ищу команду Cargo, которая обновит зависимость, даже если это означает, что мне придется вернуться к исходному коду и исправить все критические изменения, которые были внесены. Однако, если я запустил:
> cargo update pyo3 --precise 0.21.2
Или одинаково:
cargo update pyo3
Затем меня встречает следующая ошибка:
error: failed to select a version for the requirement `pyo3 = "^0.20.0"`
candidate versions found which didn't match: 0.21.2
location searched: crates.io index
required by package `eight-ball v0.1.0 (/home/harry/Documents/eight-ball)`
perhaps a crate was updated and forgotten to be re-vendored?
Вот файл Cargo.toml, каким он был до обновления:
[package]
name = "eight-ball"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[lib]
name = "eight_ball"
crate-type = ["cdylib"]
[dependencies]
itertools = "0.12.1"
pyo3 = "0.20.0"
Если я перейду к файлу Cargo.toml и вручную изменю версию pyo3 на последнюю версию, а затем создам сборку, все будет работать нормально. Не похоже, что то, что я ищу, является чем-то сумасшедшим, поэтому мне кажется, что я просто неправильно использую Cargo.
Я хотел просто иметь возможность запустить команду Cargo, чтобы обновить меня до версии 0.21.2, но очевидный выбор не работал, и я не видел опции --force или аналогичной. Я не знаю, почему он решил, что я так настроен оставаться на версии 0.20.0.
Как я могу использовать Cargo для обновления зависимостей моего проекта без необходимости напрямую изменять Cargo.toml?
Это меня немного смущает, потому что вверху Cargo.lock всегда написано, что это не для редактирования вручную. Мне нужна была команда Cargo, которая, по сути, просто перевела бы мою зависимость на последнюю версию; Я не мог понять, почему оно отказалось это сделать и на чем основан этот отказ.
Обратите внимание, что с 0.20.x по 0.21.x, как и при изменении основной версии, разрешено вносить критические изменения, что может привести к поломке существующего кода. Вот почему cargo update не обновляет его.

Вы можете установить Cargo-edit:
cargo install cargo-edit
Это добавит команду upgrade в Cargo. Вы можете использовать его для:
проверьте наличие новых несовместимых версий:
> cargo upgrade -i --dry-run
Checking mycrate's dependencies
name old req compatible latest new req
==== ======= ========== ====== =======
pyo3 0.20.3 0.20.3 0.21.2 0.21.2
обновите зависимость до последней несовместимой версии:
> cargo upgrade -i -p pyo3
обновить зависимость до конкретной несовместимой версии:
> cargo upgrade -i -p [email protected]
Для справки: ранее в Cargo-edit были cargo add и cargo rm, которые в конечном итоге были реализованы непосредственно в Cargo. Со временем это тоже может быть встроено, но связанные с этим проблемы указывают на неуверенность в том, как это в конечном итоге будет работать.
Теперь вы также можете использовать флаг --breaking по умолчанию cargo update.
В настоящее время это нестабильно, поэтому вся команда выглядит так:
cargo update --breaking -Z unstable-options
(Похоже, это одно из нескольких улучшений в редактировании груза выше, которые были включены в обновление груза по умолчанию. [cargo remove — еще одно])
груз 1.77.1: ошибка: найден неожиданный аргумент «--breaking»
Это не совсем то, о чем вы просите, но книга Cargo предлагает использовать
Cargo.lockдля указания точных версий и просто иметь общие зависимости вCargo.toml. Файл.lock— это то, чем манипулирует груз. doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html