Как указать Cargo использовать git-теги для определения версии ящика?
Я перебираю книгу Rust и изучаю Cargo. В описании Cargo.toml
форматирование, кажется, требует, чтобы вы жестко закодировали версию, над которой вы сейчас работаете или недавно выпустили в этот файл, который проверяется в контроле версий. Поскольку любой вменяемый отмечает свои выпуски, это означает, что информация о версии дублируется, и мы все знаем, что плохая идея иметь одну и ту же информацию в двух местах.
Учитывая, что Cargo кажется превосходно самоуверенным на предмет контроля версий (создание git-репо на cargo new
), Я немного удивлен, что не могу найти способ сообщить Cargo "получить информацию о версии из аннотированных тегов в репозитории". Я что-то упустил, или эта функция просто отсутствует в Cargo?
2 ответа
Чтобы закрыть этот цикл, я начал просто делать вещи жестоким способом и устанавливать «фальшивую» версию в , а затем во время сборки выпуска (выполненной через GitHub Actions) делать немного света.
sed
чтобы установить реальный номер версии, например:
- name: Set Cargo.toml version
shell: bash
env:
RELEASE_TAG: ${{ github.ref }}
run: |
mv Cargo.toml Cargo.toml.orig
sed "s/0\\.0\\.0-git/${RELEASE_TAG##*\/v}/" Cargo.toml.orig >Cargo.toml
mv Cargo.lock Cargo.lock.orig
sed "s/0\\.0\\.0-git/${RELEASE_TAG##*\/v}/" Cargo.lock.orig >Cargo.lock
Тогда уходи
Cargo.toml
как это:
[package]
version = "0.0.0-git"
Это некрасиво, но это работает.
https://crates.io/ хранит полные снимки источников ящиков без метаинформации VCS. Таким образом, эта информация о ящике должна быть закодирована в Cargo.toml
который является частью снимка.
Есть также старая проблема, связанная с идеей обратного подхода: сделать подкоманды cargo создайте git-теги при публикации новой версии на crates.io.