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

Posted

技术标签:

【中文标题】如何告诉 Cargo 使用 git 标签来确定 crate 版本?【英文标题】:How to tell Cargo to use git tags to determine the crate version? 【发布时间】:2019-02-10 01:37:51 【问题描述】:

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

鉴于 Cargo 在修订控制的主题上似乎非常固执己见(在 cargo new 上创建一个 git repo),我有点惊讶我找不到告诉 Cargo 的方法,“从回购中的注释标签”。我是否遗漏了什么,或者这是 Cargo 完全遗漏的功能?

【问题讨论】:

【参考方案1】:

crates.iostores full snapshots of crates' sources without any VCS meta-information。所以这个关于箱子的信息必须在Cargo.toml 中编码,这是快照的一部分。

an old issue 也有关于反向方法的想法:在 crates.io 上发布新版本时,让 cargo 子命令创建 git 标签。

【讨论】:

所以cargo package只需要修改包含的Cargo.toml设置一个静态version参数。我在旅行中发现了这个问题,并且 bundler 的标记行为对我来说是众所周知的,但它是倒退的。我还发现了this issue,这表明捆绑生成的数据通常不会超出货物范围。【参考方案2】:

为了结束这个循环,我开始以残酷的方式做事,并在Cargo.toml 中设置一个“假”版本,然后在发布构建期间(通过 GitHub Actions 完成)做一些简单的@987654322 @ 设置真实的版本号,像这样:

  - 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"

它很丑,但它有效。

【讨论】:

以上是关于如何告诉 Cargo 使用 git 标签来确定 crate 版本?的主要内容,如果未能解决你的问题,请参考以下文章

Git使用教程(下)

Cargo 私有仓库部署

Git学习笔记

Cargo使用文档-指定依赖项

Git015--标签管理

如何配置 Maven Cargo 以使用嵌入式 Tomcat 6 服务器?