Как указать 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.

Другие вопросы по тегам