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

8
我正在阅读Rust书籍,并学习Cargo。在对Cargo.toml格式的描述中,似乎要求您将您当前正在工作或最近发布的版本硬编码到该文件中,并将其检入版本控制。由于任何明智的人都会标记他们的发布版本,这意味着版本信息被重复了,而我们都知道在两个地方拥有相同的信息是个坏主意。
考虑到Cargo在版本控制方面非常有见地(在cargo new命令中创建git存储库),我有点惊讶地发现我找不到一种方法来告诉Cargo,“从存储库中的带注释标签获取版本信息”。我是否遗漏了什么,或者这是Cargo完全缺失的功能?
2个回答

7
为了解决这个问题,我现在采用粗暴的方法,在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"

虽然不美观,但它能够运行。


1
我不讨厌这个。感谢你解决了那个复杂的sed命令。 - snarik
太棒了,谢谢!已经成功地在这里使用了 https://github.com/timabell/gitopolis/commit/006f7ed424093eef6ecd203d3cb0ba24fc2b8d5d - Tim Abell

0

1
因此,cargo package 只需要修改包含的 Cargo.toml 文件以设置静态的 version 参数。我在我的旅行中发现了这个问题,而且我很熟悉 bundler 的标记行为,但它是反向的。我还发现了 这个问题,它显示了生成数据的捆绑对于 cargo 总体来说并不超出范围。 - womble

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接