Updated 'src/crates-io/publishing.md'.

This commit is contained in:
Hector PENG
2026-04-01 16:28:05 +08:00
parent af619f161c
commit acdbc59dfa
2 changed files with 87 additions and 87 deletions

View File

@@ -1,7 +1,10 @@
[package]
name = "guessing_game"
version = "0.1.0"
name = "guessing_game-xfossdotcom"
version = "0.1.2"
edition = "2024"
description = "一个有趣的游戏,咱们需要猜出电脑选择了哪个数字。"
license = "MIT OR Apache-2.0"
[dependencies]
rand = "0.8.5"

View File

@@ -279,24 +279,40 @@ fn main() {
## 建立 Crates.io 帐号
在咱们能发布代码箱之前,咱们需要在 [crates.io](https://crates.io) 上创建帐号,并得到 API 令牌an API token。而要这样做就要访问 [crates.io](https://crates.io) 处的主页,并通过 GitHub 帐号登录。(目前 GitHub 帐号是必须的,但该站点今后可能会支持其他创建帐号途径。)在登录后,咱们就要访问 [https://crates.io/me/](https://creates.io/me/) 处的帐号设置,而获取自己的 API 密钥API key。然后使用咱们的 API 密钥,运行 `cargo login` 命令,如下:
在发布任何代码箱之前,咱们需要在 [crates.io](https://crates.io) 上创建一个账户并获取 API 令牌。为此,请访问 [crates.io](https://crates.io) 的主页,并通过 GitHub 帐号登录。(目前需要 GitHub 账户,但该站点今后可能会支持其他创建帐号的方式。)登录后,请访问 [https://crates.io/me/](https://creates.io/me/) 处的帐号设置,并获取咱们的 API 密钥。然后,运行 `cargo login` 命令并在出现提示时粘贴咱们的密钥,如下所示:
```console
$ cargo login abcdefghijklmnopqrstuvwxyz012345
$ cargo login --registry crates-io
please paste the token found on https://crates.io/me below
abcdefghijklmnopqrstuvwxyz012345
Login token for `crates-io` saved
```
命令将告知 Cargo 咱们的 API 令牌,并 `~/.cargo/credentials` 文件中本地存储起来。请注意此令牌是个 *秘密secret*:不要与任何人分享。不论因何种缘故,与任何人分享了,咱们都应吊销他,并在 [crates.io](https://crates.io) 上生成新的令牌。
这条命令将告知 Cargo 咱们的 API 令牌,并存储在本地的 `~/.cargo/credentials` 文件中。请注意,这个令牌属于机密信息:请不要与任何人分享。当咱们出于任何原因与任何人分享了,咱们都应在 [crates.io](https://crates.io) 上吊销他并生成一个新的令牌。
> **译注**:原文这里是仅运行 `cargo login`,但译者已将登记簿修改为国内镜像,因此要加上 `--registry crates-io` 命令行选项。
>
> ```console
> $ cargo login
> error: crates-io is replaced with non-remote-registry source registry `ustc`;
> include `--registry crates-io` to use crates.io
> ```
>
> 要从 crates.io 登出,运行 `cargo logout` 即可。
>
> ```console
> $ cargo logout
> Logout token for `crates-io` has been removed from local storage
> note: This does not revoke the token on the registry server.
> If you need to revoke the token, visit <https://crates.io/me> and follow the instructions there.
> ```
## 添加元数据到新代码箱
Adding Metadata to a New Crate**
假设咱们有个打算发布的代码箱。在发布前,咱们将需要在该代码箱的 `Cargo.toml` 文件的 `[package]` 小节中添加一些元数据。
假设咱们有了个打算发布的代码箱。在发布前,咱们将需要在代码箱的 `Cargo.toml` 文件的 `[package]` 小节中,添加一些元数据。
咱们的代码箱将需要一个独特的名字。当咱们在本地于代码箱上工作时,咱们可以给代码箱取任意喜欢的名字。但是,[crates.io](https://crates.io) 上代码箱的名字则是以先到先得的原则分配的allocated on a first-come, first-served basis。一旦某个代码箱名字已被占用其他人就不能发布有着那个名字的代码箱。在尝试发布某个代码箱之前咱们要检索一下打算使用的名字。若这个名字已被使用咱们将需要找到另一名字并编辑 `Cargo.toml` 文件中 `[package]` 小节下的 `name` 字段,来使用这个用作发布的新名字,像下面这样:
咱们的代码箱将需要一个独特的名字。在本地开发代码箱时,咱们可以给代码箱取随意命名。但是,[crates.io](https://crates.io) 上的代码箱名字,是按照先到先得的原则分配的。一旦某个名字已被占用,其他人就不能以那个名字发布代码箱。在尝试发布代码箱之前,请县检索咱们打算使用的名字。当名字已被使用时,咱们将需要找到另一个名字,并编辑 `Cargo.toml` 文件中 `[package]` 小节下的 `name` 字段,以使用新的名字进行发布,像下面这样:
文件名:`Cargo.toml`
@@ -305,33 +321,23 @@ Adding Metadata to a New Crate**
name = "guessing_game"
```
即使咱们选了个独特的名字,当咱们此时运行 `cargo publish` 来发布这个代码箱时,仍将到一条告警及随后的报错:
即使咱们选了个独特的名字,当咱们此时运行 `cargo publish` 来发布代码箱时,仍将到一条告警,然后一条报错:
```console
cargo publish lennyp@vm-manjaro
$ cargo publish --registry crates-io
Updating crates.io index
warning: manifest has no description, license, license-file, documentation, homepage or repository.
See https://doc.rust-lang.org/cargo/reference/manifest.html#package-metadata for more info.
Packaging guessing_game v0.1.0 (/home/lennyp/rust-lang/guessing_game)
Verifying guessing_game v0.1.0 (/home/lennyp/rust-lang/guessing_game)
Compiling libc v0.2.132
Compiling cfg-if v1.0.0
Compiling ppv-lite86 v0.2.16
Compiling getrandom v0.2.7
Compiling rand_core v0.6.3
Compiling rand_chacha v0.3.1
Compiling rand v0.8.5
Compiling guessing_game v0.1.0 (/home/lennyp/rust-lang/guessing_game/target/package/guessing_game-0.1.0)
Finished dev [unoptimized + debuginfo] target(s) in 3.55s
Uploading guessing_game v0.1.0 (/home/lennyp/rust-lang/guessing_game)
error: failed to publish to registry at https://crates.io
warning: manifest has no description, license, license-file, documentation, homepage or repository
|
= note: see https://doc.rust-lang.org/cargo/reference/manifest.html#package-metadata for more info
-- 跳过输出 --
error: failed to publish guessing_game-xfossdotcom v0.1.2 to registry at https://crates.io
Caused by:
the remote server responded with an error: missing or empty metadata fields: description, license. Please see https://doc.rust-lang.org/cargo/reference/manifest.html for how to upload metadata
the remote server responded with an error (status 400 Bad Request): missing or empty metadata fields: description, license. Please see https://doc.rust-lang.org/cargo/reference/manifest.html for more information on configuring these fields
```
此报错是由于咱们缺失了一些重要信息:描述及许可证是必的,由此人们就会明白咱们的代码箱完成的什么,及在何种条件下他们可以使用他。在 `Cargo.toml` 中,由于代码箱的描述,会与咱们的代码箱一起现在搜索结果中,因此请添加仅仅一两句话的描述。而对于 `license` 字段,需要提供 *某个许可证标识符值a licence identifier value*。[Linux 基金会的软件包数据交换站Linux Foundation's Software Package Data Exchange, SPDXspdx.org](http://spdx.org/licenses/) 列出了可供这个值使用的标识符。如,为指明咱们已使用 MIT 许可证授权咱们的软件包,就要添加 `MIT` 的许可证标识符:
这导致了一个报错,因为咱们缺少一些关键信息:描述信息及许可证是必的,由此人们才会知道咱们的代码箱做什么,以及可以在什么条款下使用他。在 `Cargo.toml` 中,添加以两句话的描述信息,因为他会与咱们的代码箱一起现在搜索结果中对于 `license` 字段,咱们需要提供 *许可证标识符值*。[Linux 基金会的软件包数据交换](http://spdx.org/licenses/) 列出了咱们可以针对该值使用的标识符。如,要指定咱们已使用 MIT 许可证授权咱们的代码箱,请添加 `MIT` 标识符:
文件名:`Cargo.toml`
@@ -342,100 +348,91 @@ name = "guessing_game"
license = "MIT"
```
咱们打算使用某未出现 SPDX 中的许可证,咱们就需要把那种许可证的文本,放置于某个文件里,把这个文件包含在咱们的项目中,并于随后使用 `license-file` 来指出那个文件的名字,而不使用 `license` 键the `license` key
咱们打算使用某未出现 SPDX 中的许可证,咱们就需要放置该许可证的文本于文件中,在咱们的项目中包含该文件,然后使用 `license-file` 来指定该文件的名字,而不使用 `license` 键。
于哪种许可证适合咱们的项目方面的指南,是超出这本书的范围。Rust 社区的许多人都以 Rust 项目同样的方式,即采用 `MIT OR Apache-2.0` 双重许可证授权他们的项目。这种实践表明,咱们也可以通过 `OR` 来指定出多个许可证标识符,从而让咱们项目有着多种许可证。
于哪种许可证适合咱们的项目方面的指南超出这本书的范围。Rust 社区的许多人都以 Rust 项目同方式,使用 `MIT OR Apache-2.0` 双重许可证授权他们的项目。这种做法表明,咱们也可以指定由 `OR` 分隔的多个许可证标识符,有着针对咱们项目多种许可证。
添加了独特名字、版本号、代码箱描述及许可证后,已准备好发布项目的 `Cargo.toml`文件,就会看起来像下面这样:
添加了唯一名字、版本号、描述信息及许可证后,某个已准备好发布项目的 `Cargo.toml`文件可能看起来像下面这样:
文件名:`Cargo.toml`
```toml
[package]
name = "guessing_game"
license = "MIT"
version = "0.1.0"
description = "一个在其中猜出计算机所选数字的有趣游戏。"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
edition = "2024"
description = "一个有趣的游戏,咱们需要猜出电脑选择了哪个数字。"
license = "MIT OR Apache-2.0"
[dependencies]
rand = "0.8.3"
```
[Cargo 文档](https://doc.rust-lang.org/cargo/) 介绍了为确保其他人能更容易发现使用咱们代码箱,而可指明的别的一些元数据
[Cargo 文档](https://doc.rust-lang.org/cargo/) 描述了其他咱们可以指定的元数据,以确保其他人可以更轻松地发现使用咱们代码箱。
## 发布到 Crates.io
既然咱们已经创建了账号,保存了 API 令牌,选择了代码箱名字,并指定了需的元数据,那么咱们就准备好发布了!发布代码箱会上传特定版本到 [crates.io](https://crates.io),供他人使用。
现在咱们已经创建了账号,保存了 API 令牌,为代码箱选择了名字,并指定了需的元数据,咱们就可以开始发布了!发布代码箱会上传特定版本到 [crates.io](https://crates.io),供他人使用。
因为发布是 *永久性的permanent*,因此要当心。版本绝无可能被覆盖,且代码无法被删除。[crates.io](https://crates.io) 的一个主要目标,是要充当代码的永久存档,以便依赖于 [crates.io](https://crates.io) 代码箱的所有项目构建都将持续工作。允许版本删除,就会令到实现那个目标几无可能。不过,咱们可发布的代码箱版本数目上没有限制。
请小心!因为发布是 *永久性的*。该版本永远无法被覆盖,除特殊情况外,代码无法被删除。Crates.io 的一个主要目标充当代码的永久存档,以便依赖于 [crates.io](https://crates.io) 上的代码箱的所有项目构建都将持续工作。允许版本删除将使该目标变得不可能。不过,咱们可发布的代码箱版本数没有限制。
运行 `cargo publish` 命令。现在他就应成功了:
运行 `cargo publish` 命令。现在应成功了:
```console
$ cargo publish lennyp@vm-manjaro
$ cargo publish --registry crates-io
Updating crates.io index
warning: manifest has no documentation, homepage or repository.
See https://doc.rust-lang.org/cargo/reference/manifest.html#package-metadata for more info.
Packaging guessing_game-xfossdotcom v0.1.0 (/home/lennyp/rust-lang/guessing_game)
Verifying guessing_game-xfossdotcom v0.1.0 (/home/lennyp/rust-lang/guessing_game)
Compiling libc v0.2.132
Compiling cfg-if v1.0.0
Compiling ppv-lite86 v0.2.16
Compiling getrandom v0.2.7
Compiling rand_core v0.6.3
Compiling rand_chacha v0.3.1
Compiling rand v0.8.5
Compiling guessing_game-xfossdotcom v0.1.0 (/home/lennyp/rust-lang/guessing_game/target/package/guessing_game-xfossdotcom-0.1.0)
Finished dev [unoptimized + debuginfo] target(s) in 2.73s
Uploading guessing_game-xfossdotcom v0.1.0 (/home/lennyp/rust-lang/guessing_game)
Packaging guessing_game-xfossdotcom v0.1.2 (/home/hector/rust-lang-zh_CN/projects/guessing_game)
Updating `ustc` index
-- 跳过输出 --
Packaged 7 files, 5.9KiB (2.6KiB compressed)
Verifying guessing_game-xfossdotcom v0.1.2 (/home/hector/rust-lang-zh_CN/projects/guessing_game)
Compiling guessing_game-xfossdotcom v0.1.2 (/home/hector/rust-lang-zh_CN/projects/guessing_game/target/package/guessing_game-xfossdotcom-0.1.2)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 36.15s
Uploading guessing_game-xfossdotcom v0.1.2 (/home/hector/rust-lang-zh_CN/projects/guessing_game)
Uploaded guessing_game-xfossdotcom v0.1.2 to registry `crates-io`
note: waiting for guessing_game-xfossdotcom v0.1.2 to be available at registry `crates-io`
help: you may press ctrl-c to skip waiting; the crate should be available shortly
Published guessing_game-xfossdotcom v0.1.2 at registry `crates-io`
```
恭喜!现在咱们就已与 Rust 社区分享了咱们的代码,任何人都可咱们的代码箱,添加为他们项目的依赖。
恭喜!咱们现在已经与 Rust 社区分享了咱们的代码,任何人都可以轻松地添加咱们的代码箱为他们项目的依赖
> :在 Crates.io 上的账号电子邮箱未验证时,将报出如下错误:
> **译注**:在 Crates.io 上的账号电子邮箱未验证时,将报出如下错误:
>
> ```console
> Caused by:
> the remote server responded with an error: A verified email address is required to publish crates to crates.io. Visit https://crates.io/me to set and verify your email address.
> ```
## 发布现有代码箱的新版本
当咱们对代码箱的进行了修改,而准备发布新版本时,咱们要修改在 `Cargo.toml` 中指定的 `version` 值并重新发布。请根据咱们所做的修改类型,使用 [语义化版本控制规则](http://semver.org/) 来确定合适的下一个版本编号。然后,运行 `cargo publish` 上传新的版本。
## 弃用 Crates.io 上的版本
尽管咱们无法移除代码箱的较早版本但咱们可以阻止任何今后的项目添加他们为新的依赖项。当代码箱版本出于某种原因被破坏时这一特性非常有用。在这种情形下Cargo 支持 *抽出* 代码箱版本。
*抽出* 版本会防止新项目依赖于该版本,同时允许所有依赖他的现有项目继续正常运行。本质上,抽出意味着所有带有 `Cargo.lock` 的项目都不会中断,并且任何今后生成的 `Cargo.lock` 文件都将不会使用抽出的版本。
要抽出代码箱的某个版本,就要在咱们先前发布的代码箱目录下,运行 `cargo yank` 并指定咱们打算抽出的版本。例如,当咱们已发布一个名为 `guessing_game` 版本 `0.1.0` 的代码箱,而打算抽出他时,那么我们就要在 `guessing_game` 的项目目录下运行以下命令:
```console
Caused by:
the remote server responded with an error: A verified email address is required to publish crates to crates.io. Visit https://crates.io/me to set and verify your email address.
```
## 发布既有代码箱的新版本
咱们完成咱们代码箱的修改,而准备好发布新版本时,咱们要修改 `Cargo.toml` 中所指定的 `version` 值并重新发布。请运用 [语义版本控制规则Semantic Versioning rules](http://semver.org/),根据咱们已做出修改的类别,来确定出恰当的下一版本编号为何。然后运行 `cargo publish` 来上传新版本。
## 使用 `cargo yank` 命令弃用 Crates.io 上的版本
**Depracating Versions from Crates.io with `cargo yank`**
尽管咱们无法移除代码箱的先前版本但咱们可以阻止任何今后的项目将其添加为新的依赖项。这在某个代码箱版本由于某种原因或别的问题而损坏时是有用的。在诸如此类的情形下Cargo 支持把某个代码箱版本 *抽出来*in such situations, Cargo supports *yanking* a crate version。
抽出某个版本,在允许所有依赖该版本的既有项目继续工作的同时,会阻止新项目依赖那个版本。本质上,一次版本抽出,表示带有 `Cargo.lock` 的全部项目不会破坏,而任何今后生成的 `Cargo.lock` 文件,都将不使用被抽出的版本。
要抽出代码箱的某个版本,就要在咱们先前已发布的代码箱目录中,运行 `cargo yank` 并指定出要抽出的版本。比如,咱们曾发布了名为 `guessing_game` 代码箱的 `0.1.0` 版本,而打算抽出他,咱们就要在 `guessing_game` 的项目目录下,运行下面的命令:
```console
$ cargo yank --vers 0.1.0 4s lennyp@vm-manjaro
$ cargo yank --vers 0.1.0 --registry crates-io
Updating crates.io index
Yank guessing_game-xfossdotcom@0.1.0
```
通过 `--undo` 添加到这个命令,咱们还可以撤销某次抽出,而允许项目开始再度依赖于某个版本:
通过添加 `--undo` 到这个命令,咱们还可以撤销抽出,而允许项目再次依赖于某个版本:
```console
$ cargo yank --vers 0.1.0 --undo lennyp@vm-manjaro
$ cargo yank --vers 0.1.0 --undo --registry crates-io
Updating crates.io index
Unyank guessing_game-xfossdotcom@0.1.0
```
抽出版本*不会* 删除任何代码。如,无法删除那些不小心上传的机密信息。发生了机密信息被上传的情况,咱们必须立即重置这些机密信息。
抽出版本 *不会* 删除任何代码。如,无法删除意外上传的机密信息。发生这种情况,咱们必须立即重置这些机密信息。
End