version-control - 如何告诉 Cargo 使用 git 标签来确定 crate 版本?

标签 version-control rust rust-cargo

我正在仔细阅读 Rust 书,并学习 Cargo。在 Cargo.toml 格式的描述中,它似乎要求您将当前正在使用或最近发布的版本硬编码到该文件中,该文件已检入修订控制。由于任何理智的人都会标记他们的发布,这意味着版本信息是重复的,我们都知道在两个地方拥有相同的信息是多么糟糕的主意。

考虑到 Cargo 似乎对修订控制主题(在 cargo new 上创建一个 git repo)持有令人钦佩的意见,我有点惊讶我找不到告诉 Cargo 的方法, “从 repo 协议(protocol)中带注释的标签中获取版本信息”。我是不是遗漏了什么,或者这是 Cargo 完全缺少的功能?

最佳答案

为了结束这个循环,我开始以残酷的方式做事并在 Cargo.toml 中设置一个“假”版本,然后在发布构建期间(通过 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"

它很丑,但它有效。

关于version-control - 如何告诉 Cargo 使用 git 标签来确定 crate 版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52176130/

相关文章:

rust - 为什么只有main.rs可以声明mod?

rust - 为什么在其自己的 From 实现中调用 .into() 不会给出递归警告?

rust - impl block 不需要泛型参数的生命周期限制

php - PHP开发的版本控制

version-control - 从 TFS 中 check out 在 VS 之外修改的文件

svn - 同时运行 Mercurial 和 Subversion

rust - 为什么要尝试!()和?在不返回选项或结果的函数中使用时无法编译?

rust - 为什么需要绑定(bind) `T: ' a` 才能存储引用 `&' a T`?

rust - 生成 rustdoc 时如何使用本地文件作为 crate Logo ?

language-agnostic - 什么不应该受到源代码控制?