Cargo release

cargo-release 是一个用于发布 Rust 包的工具,它允许您使用 Git 标签和版本号来管理您的软件包版本。

usage

要使用 cargo release 更新版本号,创建 Git 标签,并将更改推送到远程仓库,但不发布到 crates.io,您可以使用以下命令和选项:

cargo release <LEVEL> --execute --no-publish --no-verify

或者,如果您想设置特定的版本号而不是按级别递增,可以使用:

cargo release <VERSION> --execute --no-publish --no-verify

解释:

  • cargo release: 这是 cargo-release 子命令的基本命令,用于启动发布流程。

  • <LEVEL><VERSION>:

    • <LEVEL>: 指定版本递增的级别。可以是
  • major

  • minor

  • patch

  • release

  • rc

  • beta

  • alpha

  • 例如,使用 patch 将使版本号从 x.y.z 递增到 x.y.(z+1)

    • <VERSION>: 直接指定您想要设置的版本号。例如,使用 1.2.3 将把版本设置为 1.2.3
  • --execute: 这个选项告诉 cargo release 实际执行所有步骤。默认情况下,cargo release 运行在 dry-run 模式,只进行模拟,不进行实际更改。务必加上 --execute 才能真正更新版本号、创建标签和推送。

  • --no-publish: 这个选项指示 cargo release 不要 运行 cargo publish 命令。这将阻止您的包发布到 crates.io

  • --no-verify: 建议添加此选项,以跳过构建验证步骤。由于您不打算发布到 crates.io,因此可以跳过验证以加快流程。如果您希望在发布 到您自己的仓库 之前进行验证,可以移除此选项。

示例:

1. 递增补丁版本并执行发布流程,但不发布到 crates.io:

cargo release patch --execute --no-publish --no-verify

2. 设置特定版本号并执行发布流程,但不发布到 crates.io:

cargo release 1.2.4 --execute --no-publish --no-verify

其他有用的选项 (可选):

  • --sign: 如果您想对 Git 提交和标签进行签名,可以添加此选项。这需要您配置了 GPG 密钥。

    cargo release patch --execute --no-publish --no-verify --sign
    
  • --no-push: 如果您只想更新版本号和创建本地 Git 标签,但 推送到远程仓库,可以添加此选项。如果您需要稍后手动推送,可以使用此选项。在您的问题中,您提到要推送到仓库,所以通常不需要此选项。

    cargo release patch --execute --no-publish --no-verify --no-push
    
  • --allow-branch <GLOB[,...]>: 默认情况下,cargo release 仅允许在 mastermain 分支上运行。如果您想在其他分支上运行 cargo release,可以使用此选项指定允许的分支名称模式。例如,允许在 develop 分支上发布:

    cargo release patch --execute --no-publish --no-verify --allow-branch develop
    

完整流程示例 (假设您要递增补丁版本并推送到远程仓库,但不发布到 crates.io):

  1. 确保您的 Git 仓库是干净的,并且您位于要发布的分支上。

  2. 运行以下命令:

    cargo release patch --execute --no-publish --no-verify
    
  3. cargo release 将会执行以下操作:

    • 更新您项目 Cargo.toml 文件中的版本号。
    • 提交版本号更新的更改。
    • 创建一个带有新版本号的 Git 标签。
    • 将提交和标签推送到您配置的远程仓库。
    • 不会 执行 cargo publish,因此您的包不会发布到 crates.io

请务必仔细检查 cargo release 的输出,特别是在第一次使用 --execute 选项时,以确保它执行了您期望的操作。

您可以先尝试不加 --execute 运行命令,以 dry-run 模式预览将要发生的变化。

cargo-release 的安装

您可以使用以下命令安装 cargo-release

cargo install cargo-release

cargo-release 的参数

Cargo subcommand for you to smooth your release process.

Usage: cargo release [OPTIONS] [LEVEL|VERSION]
       cargo release <STEP>

Steps:
  changes  Print commits since last tag
  version  Bump crate versions
  replace  Perform pre-release replacements
  hook     Run pre-release hooks
  commit   Commit the specified packages
  publish  Publish the specified packages
  owner    Ensure owners are set on specified packages
  tag      Tag the released commits
  push     Push tags/commits to remote
  config   Dump workspace configuration
  help     Print this message or the help of the given subcommand(s)

Arguments:
  [LEVEL|VERSION]
          Either bump by LEVEL or set the VERSION for all selected packages

          Possible values:
          - major:   Increase the major version (x.0.0)
          - minor:   Increase the minor version (x.y.0)
          - patch:   Increase the patch version (x.y.z)
          - release: Remove the pre-version (x.y.z)
          - rc:      Increase the rc pre-version (x.y.z-rc.M)
          - beta:    Increase the beta pre-version (x.y.z-beta.M)
          - alpha:   Increase the alpha pre-version (x.y.z-alpha.M)

Options:
      --manifest-path <PATH>
          Path to Cargo.toml

  -p, --package <SPEC>
          Package to process (see `cargo help pkgid`)

      --workspace
          Process all packages in the workspace

      --exclude <SPEC>
          Exclude packages from being processed

      --unpublished
          Process all packages whose current version is unpublished

  -m, --metadata <METADATA>
          Semver metadata

  -x, --execute
          Actually perform a release. Dry-run mode is the default

      --no-confirm
          Skip release confirmation and version preview

      --prev-tag-name <NAME>
          The name of tag for the previous release

  -c, --config <PATH>
          Custom config file

      --isolated
          Ignore implicit configuration files

  -Z <FEATURE>
          Unstable options

      --sign
          Sign both git commit and tag

      --dependent-version <ACTION>
          Specify how workspace dependencies on this crate should be handed

          Possible values:
          - upgrade: Always upgrade dependents
          - fix:     Upgrade when the old version requirement no longer applies

      --allow-branch <GLOB[,...]>
          Comma-separated globs of branch names a release can happen from

      --certs-source <CERTS_SOURCE>
          Indicate what certificate store to use for web requests

          Possible values:
          - webpki: Use certs from Mozilla's root certificate store
          - native: Use certs from the system root certificate store

  -q, --quiet...
          Pass many times for less log output

  -v, --verbose...
          Pass many times for more log output
          
          By default, it'll report info. Passing `-v` one time adds debug logs, `-vv` adds trace logs.

  -h, --help
          Print help (see a summary with '-h')

  -V, --version
          Print version

Commit:
      --sign-commit
          Sign git commit

Publish:
      --no-publish
          Do not run cargo publish on release

      --registry <NAME>
          Cargo registry to upload to

      --no-verify
          Don't verify the contents by building them

      --features <FEATURES>
          Provide a set of features that need to be enabled

      --all-features
          Enable all features via `all-features`. Overrides `features`

      --target <TRIPLE>
          Build for the target triple

Tag:
      --no-tag
          Do not create git tag

      --sign-tag
          Sign git tag

      --tag-prefix <PREFIX>
          Prefix of git tag, note that this will override default prefix based on sub-directory

      --tag-name <NAME>
          The name of the git tag

Push:
      --no-push
          Do not run git push in the last step

      --push-remote <NAME>
          Git remote to push