< 返回版块

minstrel1977 发表于 2021-11-05 21:23

我查看tonic的源码时,发现它tonic包里的cargo.toml中有这么一条依赖配置: prost1 = {package = "prost", version = "0.9", optional = true} 这里我奇怪的是package这个key,我翻遍The Cargo Book也没找到这个配置的具体说明,请大佬帮忙解释这个key是什么意思?完整的cargo.toml配置选项在哪里能找到?

评论区

写评论
作者 minstrel1977 2021-11-06 14:07

谢谢前面两位的回复,很有帮助!我自己也很汗颜,还是看书不认真啊。

苦瓜小仔 2021-11-06 00:11

由楼上给的链接,这两句话很适合解决你的问题:

so we're explicitly using the package key to inform Cargo that we want the foo package even though we're calling it something else locally

The package key, if not specified, defaults to the name of the dependency being requested.

  1. 所有 dependency 都有 package key,而且默认是 dependency 的 lib crate 名(也就是在 dependency 的 Cargo.toml 的 [package] 表的 name)。
  2. 本地 [dependency] 表写的依赖名(key),一般情况下也就是 dependency 的 lib crate 名,如果你希望给依赖名一个别名,就可以这样用 别名 = {package = "原名"},它相当于在 rs 文件中帮你写了 use 原名 as 别名;。而且定义了依赖的别名之后,你只能使用别名,无法使用依赖的原名。
  3. 在 Cargo book 举例说了这么做的意义:依赖于某个 crate 的多个版本,甚至那些版本可能来自于不同的平台。
  4. 但是你这里是另外的例子: 在 tonic repo 中搜索 prost1,可以看到只有两处地方使用了 prost1,这表明给 prost 别名是为了让出 prost 这个 feature 名(方便用户使用)。BTW 大型项目往往拆分出很多 workspace members,你所看到的这个依赖只在 tonic member 中这样定义,别的 member 如果重度使用 prost ,是不会定义去它的别名的。
7sDream 2021-11-05 21:45

https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html

最后一段。

1 共 3 条评论, 1 页